学了那么久,平时用 Pandas 基本上就是干 Excel 的活,事实上 Pandas 的优势在于其集成了大量高效的数据处理函数。通过矢量化的运算,节省了很多循环的时间,在处理大型数据集上有很大的优势。以下复习一下常用的数据处理函数,养成用函数代替纯代码的习惯。
更详细的文档查看官网的 User Guide ,经常翻一翻!
样本数据
id |
name |
age |
cat |
101 |
aa |
22 |
A |
432 |
bb |
Null |
B |
321 |
cc |
25 |
A |
152 |
dd |
24 |
Null |
234 |
ee |
26 |
B |
314 |
ff |
26 |
Null |
231 |
gg |
24 |
C |
基本
1
2
3
| df.head()
df.info()
df.describe()
|
缺失与重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 检查 DataFrame 或 Series 的缺失值,返回对应的布尔型 DataFrame 或 Series
df.isna()
df.cat.isna() # 注意到空字符 '' 不会被判断为 NA
# 结合 .any() 判断是否存在 NA
df.isna().any()
# 去除带有缺失值的观测
df.dropna()
# 去除重复观测
df.drop_duplicates()
# 去除无效的字段
df.drop(columns='cat')
# 缺失值填充
df.fillna('value')
# 查看唯一值的数量
df.nunique('cat')
# 统计唯一值
df.value_counts()
|
计数与排序
1
2
3
4
5
6
| # 计数:对分类变量的取值进行计数,类似 MySQL 中的 COUNT
df.cat.value_counts()
# 对 index 进行升序降序排列
df.sort_index(ascending=False)
# 按值排序,支持字符串的排序
df.sort_values(by='age')
|
重命名与重索引
1
2
3
4
5
6
7
8
9
10
11
12
| # 将某一列设为 index
df.set_index('id', inplace=True)
# 重索引
df.reset_index(inplace=True)
# 重命名字段
df.rename(columns={'cat': 'catogory'})
# 使用 assign 函数新建字段
df.assign(new_id = lambda df: df.id + 1)
# 其他重塑操作
df['test'] = [list(s) for s in df.name]
df.explode('test') # 分成多行展开列表序列
df.replace('value', 'new_value') # 重设所有行列中匹配的值
|
条件判断与类型转换
1
2
3
4
5
6
7
8
9
10
11
| # 类型转换
df.age.fillna(0).astype(float)
# 判断某一字段的取值是否在某个集合内
df.cat.isin(['A', 'D'])
# 按条件转化取值
df.age.where(df.cat == 'A', 0)
# 涉及复杂条件时使用 query 函数更加清楚
df.query('id > 100 & id < 200')
# 当以上的条件表达式含有非 DataFrame 的变量,增加 @ 符号
limit = 100
df.query('id > @limit')
|
离散化与分组聚合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 将年龄离散化分成三个区间:
pd.cut(df.age, bins=3)
# 指定断点:
pd.cut(df.age, bins=[20,23,26,29])
# 指定每一组的label
pd.cut(df.age, bins=3, labels=['A', 'B', 'C'])
# 按分位数进行离散化
pd.qcut(df.age, q=3)
# 按某一字段分组(返回 DataFrameGroupBy 对象)
group = df[['age', 'cat']].groupby('cat')
# 显示所有分组
list(group)
# 对分组进行聚合运算
group.agg(np.mean)
# transform: 返回同样维度的聚合结果(用于更改值或新增字段)
group.transform(np.mean)
# apply: 跟agg类似
group.apply(np.mean)
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# 透视表:多维度的分组聚合
df.pivot_table(values='id', index='cat', columns='age', aggfunc=np.mean)
|
map, apply, applymap
1
2
3
4
5
6
7
8
| # map: 对序列操作,没有匹配的取值为 NaN
df.cat.map({'A':'AA'})
# apply: 对序列操作,按传入函数更改值
df.age.apply(lambda x: x + 1)
# apply: 对数据框操作,需指定 axis
df[['id', 'age']].apply(sum, axis=0)
# applymap: 对每个单元格单独进行操作
df[['id', 'age']].applymap(lambda x: x+1)
|
concat, merge
1
2
3
4
5
| # 纵向拼接数据框,并重置索引
pd.concat([df, df], ignore_index=True)
# merge: 合并两个表
df1.merge(df2, how='inner', on='main_key')
# merge可选参数:inner、outer、left、right
|