Pandas_note
前言:对于所有代码,能够看到前面的中文就能写出相关代码。
basic conception
pandas: panel data
db: database
crud: create, read, update, delete
core class: Series, DataFrame
导入
1import pandas as pd
Series
- 通过list创建
| |
- 通过字典创建
| |
DataFrame
- 通过list创建
| |
- 通过字典创建
| |
csv&excel读写
- csv读写
| |
- excel读写
| |
drop删除
已知创建df:
dic = { “序号”: [1, 2, 3, 4], “姓名”: [“小李”, “小明”, “小红”, “小张”], “分数”: [3.38, 6.38, 5.38, 1.38], “评级”: [“良”, “优”, “良”, “差”], } df = pd.DataFrame(dic)
对象.drop
| |
- 对象.dropna()
| |
- 对象.drop_duplicates (注意s: duplicates)
| |
- 对象.del
| |
删选/保留/逆向删除
| |
- 布尔索引:保留符合条件的条目(行,元组)
| |
- 选择特定列
| |
定位赋值修改
这是修改数据的最常用、最规范的方法。我们通过一个例子来彻底讲清楚。
创建一个示例
注意我特意把行索引设置得比较复杂,包含字符串和整数,这样能更好地展示 loc 和 iloc 的区别。
| |
使用 .iloc (基于整数位置)
原始 DataFrame:
score age city
Alice 88 25 NY
Bob 92 30 LA
100 95 35 SF <-- 注意这里的行索引名是整数 100
David 74 22 TXiloc 只认位置,不认名字。行号从上到下是 0, 1, 2, 3… 列号从左到右是 0, 1, 2…
1. 修改单个单元格 df.iloc[行号, 列号]
| |
2. 修改一整行 df.iloc[行号]
| |
3. 修改一整列 df.iloc[:, 列号]
: 代表“所有”。[:, 列号] 的意思就是“所有行,但只选指定的列”。
| |
4. 修改一个切片(子区域) df.iloc[行号范围, 列号范围]
切片范围是**“左闭右开”**的,和普通 Python 列表一样。例如 0:2 表示第0行和第1行,不包括第2行。
| |
使用 .loc (基于标签名称)
loc 只认行索引名和列名。
原始 DataFrame:
score age city
Alice 88 25 NY
Bob 92 30 LA
100 95 35 SF <-- 注意这里的行索引名是整数 100
David 74 22 TX1. 修改单个单元格 df.loc[行索引名, 列名]
| |
2. 修改一整行 df.loc[行索引名]
| |
3. 修改一整列 df.loc[:, 列名]
| |
4. 修改一个切片 df.loc[行范围, 列范围]
‼️ 重要区别:loc 的切片是**“左右都闭合”**的!'Alice':'Bob' 表示从 ‘Alice’ 到 ‘Bob’,包括 ‘Alice’ 和 ‘Bob’。
| |
‼️ 陷阱与总结
看我们的例子,行索引有一个整数 100。
df.loc[100]会找到行索引名为100的那一行 (第三行)。df.iloc[2]会找到物理位置在第3位的那一行(行号为2),也就是索引名为100的那一行。在这个例子里,结果碰巧一样。df.iloc[100]会报错! 因为 DataFrame 只有4行,没有第101个位置(行号100)。
| 特性 | .loc (Location) | .iloc (Integer Location) |
|---|---|---|
| 定位方式 | 基于标签 (Label-based) | 基于整数位置 (Integer-based) |
| 输入类型 | 行/列的名字 | 行/列的数字序号 (从0开始) |
| 切片行为 | 包含结束点 (Inclusive) | 不包含结束点 (Exclusive) |
| 主要用途 | 当你的索引有实际意义时(如姓名、日期) | 当你需要按位置选取,或索引混乱/无意义时 |
最佳实践:为了避免混淆,尽量保持代码意图清晰。如果你想按位置操作,就用 .iloc;如果你想按名称操作,就用 .loc。