Pandas-数据处理函数

使用 Pandas 集成的函数更高效地处理数据

Posted by Paradise on December 23, 2020

学了那么久,平时用 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