跳转到内容

【限时特惠】小白玩转Python数据分析_哔哩哔哩_bilibili

Jupyter NoteBook

00:08 00:08:40

00:08 00:08:48

Markdown轻量级标记语言

00:01 00:01:17

00:01 00:01:43

Latex语言

00:06 00:06:37

NumPy

00:00 00:00:20

00:00 00:00:25

NP数据处理快

00:01 00:01:13

00:02 00:02:13

00:02 00:02:23

00:04 00:04:39

NumPy入门练习

00:03 00:03:04

连接数组

00:00 00:00:44

00:01 00:01:09

  • 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])

列表包含所有希望元素

  • 导入:import numpy as np
  • 创建arr1arr1 = 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]
  • 输出arr1从第2个到第4个元素(切片):arr1[1:4]
  • arr4:使用 np.concatenate((arr1, arr2, arr3)) 拼接三个数组
    • 传入一个序列 (如元组或列表) 包含 arr1、arr2、arr3
    • arr1/arr2 元素:[1, 2, 4, 9]arr3np.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安装完全相同
```bash
pip install pandas
  • 安装输出示例:
    • Collecting pandas (Using cached pandas-2.0.1…)
    • Successfully installed pandas-2.0.1
  • 导入:惯例使用 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 5
1 17
2 3
3 26
4 31
dtype: int64
- 显示索引(0到4)和对应值
  • 与 NumPy 数组区别:左侧专门展示对应的标签(索引),右侧显示元素
  • 创建 Series:使用指定方法生成
  • 标签索引提取:输出标签从 5 到 3 的元素
  • Series 操作:针对单个 Series 或 Series 与 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 NaN
dtype: 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.0
dtype: float64
  • 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):减法,缺失用0
    • s1.mul(s2, fill_value=1):乘法,缺失用1
    • s1.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
小丽 78
dtype: int64
  • 输出 s2
小明 95
小杰 85
小宇 76
小丽 76
小红 76
dtype: int64
  • 计算s1.add(s2, fill_value=0)
    • 自动对齐姓名索引,顺序无关
    • 输出:
小明 187.0
小红 143.0
小杰 155.0
小宇 162.0
小丽 154.0
dtype: float64
  • 表格结构(4列:姓名 | 学号 | 班级 | 成绩)
姓名 学号 班级 成绩
小明 01 二班 92
小红 02 一班 67
小杰 03 二班 70
小丽 04 三班 88
小华 05 一班 76

00:01 00:01:16

  • 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
  • 索引继承:使用带自定义索引的 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
  • 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条件筛选相同
  • 练习要求:创建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"])
  • 注意:代码中引号和逗号必须用英文标点

    • 中文标点会导致语法错误
  • 步骤

    1. 创建各Series(指定标签索引)
    2. students = pd.DataFrame({'name': name_s, 'gender': gender_s, 'like_fakes': height_s})
    3. 输出students
    4. print(students.index) 查看索引
    5. 查看列名和索引信息
  • 使用&;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'(倒序),值按此顺序绑定
  • height Series 创建:使用同样方法,数据为浮点身高,index=[‘001’,‘002’,‘003’,‘004’,‘005’]
    • 故意少一个数据(到005而非006)
    • 注意:输入完成后必须运行,否则变量未创建
  • 组合成 students DataFramepd.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.5
002 小红 女 168.0
003 小杰 男 178.2
004 小丽 女 181.3
005 小华 男 161.7
  • 注意观察:不同Series数据按索引对齐(如001: 小明/女/172.5)
  • 不同Series index顺序不影响:即使gender index倒序(如[‘006’,‘005’,‘004’,‘003’,‘002’]),创建DataFrame时自动按index值对齐
    • 示例gender数据按倒序:[‘男’,‘女’,‘男’,‘女’,‘女’] → 对齐后按001-005顺序为男、女、男、女、女
  • students DataFrame输出
姓名 性别 身高
001 小明 172.5
002 小红 168.0
003 小李 178.2
004 小王 161.3
005 小张 161.7
  • 对齐机制:按index标签(如001-005)匹配各Series值,确保DataFrame行数据正确对应
  • 数据对齐验证:索引001对应小明/男/175.0,按共同标签自动匹配各列数据
    • 示例:001行:姓名“小明”、性别“男”、身高175.0
  • 缺失值产生:索引006height数据 → 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 获取所有列名
  • print(students.index) 输出:
Index(['001', '002', '003', '004', '005'], dtype='object')
  • print(students.columns) 输出:
Index(['姓名', '学号', '身高'], dtype='object')
  • 使用 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.5
002 168.0
003 178.2
004 181.3
005 161.7
006 NaN
Name: 身高, dtype: float64
  • 方括号方式更通用:列名含空格或其他特殊字符时,点号访问无效
    • 点号无法识别空格(如身高 空格
    • 字符串列名确保代码识别完整列名
  • 同时提取多列:`students’性别’, ‘身高’’ - 返回指定列的 DataFrame - 先输入 DataFrame 名,后续操作以此为基础

DataFrame 提取多列 - 方法二:列名列表

Section titled “DataFrame 提取多列 - 方法二:列名列表”
  • 提取多个列students"性别", "身高"
    • 传入列名列表(方括号内再套列表),返回多列DataFrame
    • 示例输出(基于students数据):
性别 身高
001172.5
002168.0
003178.2
004181.3
005161.7
  • loc:根据标签索引提取行(如’003’)
  • iloc:根据位置索引提取行
    • 示例:students.loc['003'](标签’003’对应行)