Pandas
中提供了灵活的分组功能,通过groupby
实现,对数据进行切片、切块、合并等操作
- 计算分组摘要:计数、平均值、标准差,用户自定义函数
- 组内变换或者其他运算,规格化、线性回归、排名或选取子集等
- 计算透视表、交叉表等
- 执行分位数和其他统计分组分析
groupby
机制
分组运算术语:拆分---应用---合并
- 拆分:根据提供的键进行拆分,操作在特定的轴上进行;
axis=0
表示行,axis=1
表示列 - 应用:将函数应用
(apply)
到各个分组上面,产生新的值 - 合并:将函数执行对象的新的值
combine
到最终的结果对象中
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 创建数据
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
'key2' : ['one', 'two', 'one', 'two', 'one'],
'data1' : np.random.randn(5),
'data2' : np.random.randn(5)})
df
# 变量grouped是⼀个GroupBy对象,存储了分组键df["key1"]的中间数据
# 将data1的数据按照key1进行分组
grouped = df['data1'].groupby(df['key1'])
grouped
由groupby方法产生的是个GroupBy对象,可以进行任何DF操作
# 通过两个键进行分组,得到S的层次化索引
# 分组键均为S;分组键可以是任何长度适当的数组
means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means
means.unstack()
states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
# 对data1的数据通过states、years
df['data1'].groupby([states, years]).mean()
对分组进行迭代
利用for
对分组结果进行迭代:
for name, group in df.groupby('key1'):
print(name)
print(group)
# 结果
a
key1 key2 data1 data2
0 a one 0.929721 -1.281824
1 a two 1.437029 0.471776
4 a one 0.129513 1.108706
b
key1 key2 data1 data2
2 b one 1.431398 -1.136894
3 b two -1.014708 -0.089907
# 分组数据进行任何操作,做成字典形式
pieces = dict(list(df.groupby('key1')))
pieces['b']
# groupby默认是在axis=0上分组
grouped = df.groupby(df.dtypes, axis=1)
for dtype, group in grouped:
print(dtype)
print(group)
通过字典或者Series
分组
people = pd.DataFrame(np.random.randn(5, 5),
columns=['a', 'b', 'c', 'd', 'e'],
index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.iloc[2:3, [1, 2]] = np.nan
map_series = pd.Series(mapping)
map_series
people.groupby(map_series, axis=1).count()
apply方法使用
- 将待处理的对象拆分成多个片段
- 各个片段调用传入的函数
- 将各个片段组合在一起
用fillna
填充
-
dropna
能够用于填充 -
fillna()
能够填充指定值
s = pd.Series(np.random.randn(6))
s[::2] = np.nan
s
- 针对一个列进行填充
# 缺失值填充为整个数据的平均值
s.fillna(s.mean())
- 针对多个列进行填充
states = ['Ohio', 'New York', 'Vermont', 'Florida',
'Oregon', 'Nevada', 'California', 'Idaho']
group_key = ['East'] * 4 + ['West'] * 4
group_key
- 利用分组的平均值进行填充
# 用分组平均值填充NA值
fill_mean = lambda g: g.fillna(g.mean())
data.groupby(group_key).apply(fill_mean)
缺失值填充
# 设置缺失值
data[['Vermont', 'Nevada', 'Idaho']] = np.nan
data
data.groupby(group_key).mean()
![image.png](https://upload-images.jianshu.io/upload_images/5142014-459ae80eca306431.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 预定义填充值
fill_values = {'East': 0.5, 'West': -1}
# 分组中的name属性
fill_func = lambda g: g.fillna(fill_values[g.name])
# 调用apply函数
data.groupby(group_key).apply(fill_func)
透视表pivot table
- 根据一个或者多个键对数据进行聚合
- 根据行和列上的分组键将数据分配到各个矩形区域
-
groupby+reshape
重塑功能实现透视表 -
DF
的pivot_table
实现:默认聚合类型是计算分组平均数
交叉表crosstab
-
crosstab
的前两个参数可以是数组或Series
,或是数组列表 - 对数据计算分组频率的透视表