【限时特惠】小白玩转Python数据分析_哔哩哔哩_bilibili
Jupyter NoteBook
Markdown轻量级标记语言
Latex语言
NumPy
NP数据处理快
NumPy入门练习
连接数组
NumPy 数组创建示例
Section titled “NumPy 数组创建示例”- arr1:包含元素 1, 3, 2, 4, 9 的数组
- arr2:包含 1到8整数 的一维数组(或全1长度5数组)
- arr3:长度 30 的随机一维数组(或全0长度3数组)
- arr4:包括 arr1, arr2 元素,连接后输出
- 更新 arr1:对元素排序,输出结果
- 创建指定元素数组:用
np.array(列表)
arr1 = np.array([1, 3, 2, 4, 9])列表包含所有希望元素
NumPy数组创建与操作
Section titled “NumPy数组创建与操作”- 导入:
import numpy as np - 创建arr1:
arr1 = np.array([1, 3, 2, 4, 8]) - 创建arr2(全1,长度5):
arr2 = np.ones(5)- ones方法传入长度即可
- 创建arr3(全0,长度9):
arr3 = np.zeros(9)- zeros方法传入长度即可
- 创建arr4:包含arr1、arr2、arr3所有元素
- 使用
np.concatenate([arr1, arr2, arr3])- concatenate意为拼接
- 使用
- 对arr1排序:
np.sort(arr1)或arr1.sort()(原地排序),输出排序后结果 - 打印arr1第三个元素(两种方法)
- 索引从0开始:
arr1[2]
- 索引从0开始:
- 输出arr1从第2个到第4个元素(切片):
arr1[1:4]
NumPy 数组连接 - arr4 创建
Section titled “NumPy 数组连接 - arr4 创建”- arr4:使用
np.concatenate((arr1, arr2, arr3))拼接三个数组- 传入一个序列 (如元组或列表) 包含 arr1、arr2、arr3
- arr1/arr2 元素:
[1, 2, 4, 9];arr3:np.zeros(3)全0数组长度3 - 输出:
array([1., 2., 4., 9., 1., 2., 4., 9., 0., 0., 0.]) - 验证:包含所有三个数组的元素
arr4 = np.concatenate((arr1, arr2, arr3))- 提示:函数名长无需死记,写代码时可临时搜索
### NumPy 数组操作进阶
- 输出 **arr1** 第2个到第4个元素组成的数组:`arr1[1:4]`,索引从0开始。- **Pandas**:一个新的数据分析库。 - 优势:构建在 **NumPy** 之上,继承了 **NumPy** 高性能的数组计算功能。
## Pandas
- **继承NumPy**:高性能数组计算功能 + 更多复杂精细的数据处理功能- **安装**: - CMD/终端:`pip install pandas` - macOS:可能需 `pip3 install pandas` - 过程与NumPy安装完全相同
```bashpip install pandas- 安装输出示例:
- Collecting pandas (Using cached pandas-2.0.1…)
- Successfully installed pandas-2.0.1
Pandas 导入与 Series 创建
Section titled “Pandas 导入与 Series 创建”- 导入:惯例使用
import pandas as pd- as pd:给 pandas 库起别名 pd
- 好处:使用库内方法或变量只需打 pd 两个字母,而非完整 pandas
import pandas as pd- 第一个数据结构:Series
- 与 NumPy 一维数组很相似,让人觉得熟悉
- 创建:
s1 = pd.Series([5, 17, 3, 26, 31])- Series 首字母大写,是 Series 类的构造函数
- 参数传入一个列表
- 返回 Series 类实例
s1 = pd.Series([5, 17, 3, 26, 31])s1- 输出示例:
0 51 172 33 264 31dtype: int64- 显示索引(0到4)和对应值Pandas Series 基础
Section titled “Pandas Series 基础”- 与 NumPy 数组区别:左侧专门展示对应的标签(索引),右侧显示元素
- 创建 Series:使用指定方法生成
- 标签索引提取:输出标签从 5 到 3 的元素
- Series 操作:针对单个 Series 或 Series 与 Series 之间的操作
Pandas Series 运算与索引对齐
Section titled “Pandas Series 运算与索引对齐”- Series 与 Series 计算:支持加减乘除等操作
- Pandas 自动根据索引排序并对齐
- 只有共同索引才有计算结果,否则为 NaN(not a number,无法计算)
s1 + s2
# 输出示例:
# 1 9.0
# 2 NaN
# 3 11.0
# 5 NaN
# 7 NaN
# 9 NaN
# 10 NaNdtype: float64- 处理缺失值:用方法而非符号操作,可设置 fill_value 参数提供默认值
- 符号(如
+)无法传参 - 方法示例:
s1.add(s2, fill_value=0)
- 符号(如
s1.add(s2, fill_value=0)
# 输出示例:所有NaN位置补0
# 1 9.0
# 2 0.0
# 3 11.0
# 5 0.0
# 7 0.0
# 9 0.0
# 10 0.0dtype: float64Pandas Series 方法运算与 fill_value
Section titled “Pandas Series 方法运算与 fill_value”- add 方法示例:
s1.add(s2, fill_value=0)- 缺失值用0替换,避免 NaN
- 示例:索引2只在 s2(值为1),s1 用0替代,计算 1+0=1
s1.add(s2, fill_value=0)
# 输出示例:
# 0 9.0
# 1 1.0
# 2 11.0
# ... (NaN 位置补0)dtype: float64- 其他方法:
s1.sub(s2, fill_value=0):减法,缺失用0s1.mul(s2, fill_value=1):乘法,缺失用1s1.div(s2, fill_value=1):除法,缺失用1
Series 索引对齐优势 - 自定义索引示例
Section titled “Series 索引对齐优势 - 自定义索引示例”- 好处:自动根据索引对齐,即使顺序不同也能匹配对应位置
- 创建带字符串索引的 Series
s1 = pd.Series([92, 67, 70, 86, 78], index=['小明', '小红', '小杰', '小宇', '小丽'])s2 = pd.Series([95, 85, 76, 76, 76], index=['小明', '小杰', '小宇', '小丽', '小红'])
print(s1)print(s2)- 输出 s1:
小明 92小红 67小杰 70小宇 86小丽 78dtype: int64- 输出 s2:
小明 95小杰 85小宇 76小丽 76小红 76dtype: int64- 计算:
s1.add(s2, fill_value=0)- 自动对齐姓名索引,顺序无关
- 输出:
小明 187.0小红 143.0小杰 155.0小宇 162.0小丽 154.0dtype: float64DataFrame 视觉示例
Section titled “DataFrame 视觉示例”- 表格结构(4列:姓名 | 学号 | 班级 | 成绩)
| 姓名 | 学号 | 班级 | 成绩 |
|---|---|---|---|
| 小明 | 01 | 二班 | 92 |
| 小红 | 02 | 一班 | 67 |
| 小杰 | 03 | 二班 | 70 |
| 小丽 | 04 | 三班 | 88 |
| 小华 | 05 | 一班 | 76 |
DataFrame 创建方法
Section titled “DataFrame 创建方法”- DataFrame 概念:由 Series 组成的字典
- 第一种创建方法:传入字典,键为列名,值为 Series(或列表)
s_id = pd.Series(['01', '02', '03', '04', '05'])s_class = pd.Series(['一班', '一班', '二班', '三班', '一班'])s_grade = pd.Series([92, 67, 70, 88, 76])df = pd.DataFrame({ "学号": s_id, "班级": s_class, "成绩": s_grade})df- 输出示例(默认整数索引 0-4):
| 学号 | 班级 | 成绩 | |
|---|---|---|---|
| 0 | 01 | 一班 | 92 |
| 1 | 02 | 一班 | 67 |
| 2 | 03 | 二班 | 70 |
| 3 | 04 | 三班 | 88 |
| 4 | 05 | 一班 | 76 |
带自定义索引的 DataFrame
Section titled “带自定义索引的 DataFrame”- 索引继承:使用带自定义索引的 Series,DataFrame 索引随之改变
s_id = pd.Series(['01', '02', '03', '04', '05'], index=['小明', '小红', '小杰', '小丽', '小华'])s_class = pd.Series(['一班', '一班', '二班', '三班', '一班'], index=['小明', '小红', '小杰', '小丽', '小华'])s_grade = pd.Series([92, 67, 70, 88, 76], index=['小明', '小红', '小杰', '小丽', '小华'])df2 = pd.DataFrame({ "学号": s_id, "班级": s_class, "成绩": s_grade})df2- 输出示例(姓名索引):
| 学号 | 班级 | 成绩 | |
|---|---|---|---|
| 小明 | 01 | 一班 | 92 |
| 小红 | 02 | 一班 | 67 |
| 小杰 | 03 | 二班 | 70 |
| 小丽 | 04 | 三班 | 88 |
| 小华 | 05 | 一班 | 76 |
DataFrame 其他创建方法与提取操作
Section titled “DataFrame 其他创建方法与提取操作”- 带索引Series创建:字典值用带自定义索引的Series,DataFrame继承索引
s_id = pd.Series(['01', '02', '03', '04', '05'], index=['小明', '小红', '小亮', '小明', '小华'])s_class = pd.Series(['一班', '一班', '二班', '三班', '一班'], index=['小明', '小红', '小亮', '小明', '小华'])s_grade = pd.Series([92, 67, 70, 88, 76], index=['小明', '小红', '小亮', '小明', '小华'])df3 = pd.DataFrame({'学号': s_id, '班级': s_class, '成绩': s_grade})- 输出(索引允许重复“小明”):
| 学号 | 班级 | 成绩 | |
|---|---|---|---|
| 小明 | 01 | 一班 | 92 |
| 小红 | 02 | 一班 | 67 |
| 小亮 | 03 | 二班 | 70 |
| 小明 | 04 | 三班 | 88 |
| 小华 | 05 | 一班 | 76 |
- 列表创建+设置索引:先用字典创建默认索引,再
df.index = [...]
df4 = pd.DataFrame({ '学号': ['01', '02', '03', '04', '05'], '班级': ['一班', '一班', '二班', '三班', '一班'], '成绩': [92, 67, 70, 88, 76]})df4.index = ['小明', '小红', '小亮', '小明', '小华']- 提取列:
df4['班级']或df4['成绩']返回Series(继承原索引),类似dict[key]- 示例
df4['班级']:
- 示例
小明 一班小红 一班小亮 二班小明 三班小华 一班Name: 班级, dtype: object- 提取行:
df4.loc'小明', '小亮':标签索引选多行(返回重复“小明”行)
| 学号 | 班级 | 成绩 | |
|---|---|---|---|
| 小明 | 01 | 一班 | 92 |
| 小亮 | 03 | 二班 | 70 |
| 小明 | 04 | 三班 | 88 |
- `df4.iloc[1:3]`:**位置索引**切片,**不包含结束位置**| 学号 | 班级 | 成绩 | |
|---|---|---|---|
| 小红 | 02 | 一班 | 67 |
| 小亮 | 03 | 二班 | 70 |
DataFrame 行索引与筛选
Section titled “DataFrame 行索引与筛选”- loc 标签索引提取:指定行标签,返回对应行DataFrame
- 示例:
df4.loc'小红', '小红'输出两行
- 示例:
学号 班级 成绩 小红 01 二班 92 小红 02 一班 67- **切片包含结束值**:标签索引切片不同于位置索引- iloc 位置索引提取:指定位置,返回对应行
- 示例:
df4.iloc1输出第2行(位置1)
- 示例:
学号 班级 成绩 小红 02 一班 67- 示例:`df4.iloc[1:3]` 输出位置1到2(不含3)的**2行**学号 班级 成绩 小红 02 一班 67 小红 03 二班 70- 全行提取:
loc[:]或iloc[:]表示全部范围索引
- 布尔索引:
df4[df4['成绩'] > 80]筛选成绩>80的行- 输出:
学号 班级 成绩 小红 01 二班 92 小红 04 三班 88- **相似性**:与NumPy数组和Series条件筛选相同DataFrame 学生数据创建练习
Section titled “DataFrame 学生数据创建练习”- 练习要求:创建3个带标签Series(标签“001”~“005”),组合成students DataFrame
name:[“小明”, “小红”, “小杰”, “小华”, “小雨”]gender:[“女”, “女”, “男”, “男”, “女”]like_fakes(身高):[171.5, 168.0, 178.2, 181.3, 181.7]
pd.Series(["小明", "小红", "小杰", "小华", "小雨"], index=["001", "002", "003", "004", "005"])-
注意:代码中引号和逗号必须用英文标点
- 中文标点会导致语法错误
-
步骤:
- 创建各Series(指定标签索引)
students = pd.DataFrame({'name': name_s, 'gender': gender_s, 'like_fakes': height_s})- 输出
students print(students.index)查看索引- 查看列名和索引信息
Series 创建指定自定义索引
Section titled “Series 创建指定自定义索引”- 使用&;
index&;参数:传入列表指定每个值的标签,对应位置匹配- 示例:
import pandas as pd
name = pd.Series(['小明', '小红', '小杰', '小丽', '小华'], index=['001', '002', '003', '004', '005'])- **顺序对应**:列表位置决定标签绑定,如 '小明' → '001'- index 可任意顺序:不同Series标签不需一致,用于后续DataFrame构建
- 示例 gender(倒序index)对应不同数据顺序:
gender = pd.Series(['男', '女', '男', '女', '女'], index=['006', '005', '004', '003', '002'])
height = pd.Series([168.5, 170.2, 175.0, 163.8, 181.3], index=['001', '002', '003', '004', '005'])- **注意**:gender index 从 '006' 到 '001'(倒序),值按此顺序绑定students DataFrame 创建
Section titled “students DataFrame 创建”- height Series 创建:使用同样方法,数据为浮点身高,index=[‘001’,‘002’,‘003’,‘004’,‘005’]
- 故意少一个数据(到005而非006)
- 注意:输入完成后必须运行,否则变量未创建
- 组合成 students DataFrame:
pd.DataFrame({'name': name, 'gender': gender, 'height': height})- 指定列名:name、gender、height
- 各Series作为字典值,键为列名
- students DataFrame 创建完成:
students = pd.DataFrame({'姓名': name, '性别': gender, '身高': height})- 列名:键指定(姓名、性别、身高),值对应各Series
- 索引对齐:继承共同标签001~005,不同Series数据自动匹配位置
姓名 性别 身高001 小明 女 172.5002 小红 女 168.0003 小杰 男 178.2004 小丽 女 181.3005 小华 男 161.7- 注意观察:不同Series数据按索引对齐(如001: 小明/女/172.5)
students DataFrame 自动索引对齐
Section titled “students DataFrame 自动索引对齐”- 不同Series index顺序不影响:即使gender index倒序(如[‘006’,‘005’,‘004’,‘003’,‘002’]),创建DataFrame时自动按index值对齐
- 示例gender数据按倒序:[‘男’,‘女’,‘男’,‘女’,‘女’] → 对齐后按001-005顺序为男、女、男、女、女
- students DataFrame输出:
姓名 性别 身高001 小明 男 172.5002 小红 女 168.0003 小李 男 178.2004 小王 女 161.3005 小张 女 161.7- 对齐机制:按index标签(如001-005)匹配各Series值,确保DataFrame行数据正确对应
DataFrame 索引与列名查看
Section titled “DataFrame 索引与列名查看”- 数据对齐验证:索引001对应小明/男/175.0,按共同标签自动匹配各列数据
- 示例:001行:姓名“小明”、性别“男”、身高175.0
- 缺失值产生:索引006无height数据 → NaN
- NaN表示not a number,之前Series运算中见过
- 示例:006行 小王/男/NaN
print(students.index)
# 输出: Index(['001', '002', '003', '004', '005', '006'], dtype='object')
print(students.columns)
# 输出: Index(['name', 'gender', 'height'], dtype='object')- 属性查看:
students.index获取所有行索引students.columns获取所有列名
students DataFrame 索引与列名查看
Section titled “students DataFrame 索引与列名查看”print(students.index)输出:
Index(['001', '002', '003', '004', '005'], dtype='object')print(students.columns)输出:
Index(['姓名', '学号', '身高'], dtype='object')DataFrame T 属性转置
Section titled “DataFrame T 属性转置”- 使用 T 属性(不是方法,勿加括号):
students.T- 行变列,列变行
- 示例输出:
0 1 2 3 4 姓名 小明 小红 小杰 小田 小华 学号 B1 B2 B3 B4 B5 身高 173.0 175.5 168.0 170.0 167.7提取 DataFrame 列 - 方法一:属性访问
Section titled “提取 DataFrame 列 - 方法一:属性访问”- 直接点号 + 列名:
students.身高- 将列名视为 DataFrame 属性
- 返回对应 Series(继承行索引)
- 提取 DataFrame 列 - 方法二:方括号加列名:
students['身高']- 返回对应 Series(继承行索引) - 示例输出:
001 172.5002 168.0003 178.2004 181.3005 161.7006 NaNName: 身高, dtype: float64- 方括号方式更通用:列名含空格或其他特殊字符时,点号访问无效
- 点号无法识别空格(如身高 空格)
- 字符串列名确保代码识别完整列名
- 同时提取多列:`students’性别’, ‘身高’’ - 返回指定列的 DataFrame - 先输入 DataFrame 名,后续操作以此为基础
DataFrame 提取多列 - 方法二:列名列表
Section titled “DataFrame 提取多列 - 方法二:列名列表”- 提取多个列:
students"性别", "身高"- 传入列名列表(方括号内再套列表),返回多列DataFrame
- 示例输出(基于students数据):
性别 身高001 男 172.5002 女 168.0003 男 178.2004 女 181.3005 男 161.7DataFrame 行提取 - loc 与 iloc
Section titled “DataFrame 行提取 - loc 与 iloc”- loc:根据标签索引提取行(如’003’)
- iloc:根据位置索引提取行
- 示例:
students.loc['003'](标签’003’对应行)
- 示例: