1. pd.groupby()
df.groupby(
by=None, # mapping, function, label, or list of labels
axis=0, # {0 or 'index', 1 or 'columns'}, default 0
level=None, # int, level name, or sequence of such, default None
as_index=True, # bool, default True
sort=True,
group_keys=True, # bool, default True
squeeze=False, # bool, default False
observed=False, # bool, default False
**kwargs,
)
作用:
- 数据分组;
- 数据标准化
2. groupby()的基本操作
- 按列取值
- 按组迭代,GroupBy对象支持直接按组进行迭代;
- 调用方法,GroupBy对象可以调用对象,比如describe()
3. 累计aggregate
aggregate()可以支持更复杂的操作,比如字符串、函数或者函数列表,并且能一次性计算所有累计值。
df = pd.DataFrame({'key':list('ABCABC'),
'data1':range(6),
'data2':np.random.randint(0,10,6)},
columns=['key','data1','data2'])
print(df)
key data1 data2
0 A 0 8
1 B 1 3
2 C 2 6
3 A 3 4
4 B 4 8
5 C 5 5
#######################
print(df.groupby('key').aggregate([min,max,np.median]))
data1 data2
min max median min max median
key
A 0 3 1.5 4 8 6.0
B 1 4 2.5 3 8 5.5
C 2 5 3.5 5 6 5.5
# 也可以使用Python字典指定不同列需要累计的函数
print(df.groupby('key').aggregate({'data1':'min',
'data2':'max'}))
data1 data2
key
A 0 8
B 1 8
C 2 6
4. 过滤filter
过滤操作可以让你按照分组的属性丢弃若干数据。
print(df.groupby('key').filter(lambda x: x['data2'].std() < 3))
key data1 data2
0 A 0 8
2 C 2 6
3 A 3 4
5 C 5 5
5. 转换transform
累计操作返回的是对组内全量数据缩减过的结果,而转换操作返回一个新的全量数据。数据经过转换后,其形状与原来的输入数据是一样的。常见的例子就是将每一组的样本数据减去各组的均值,实现数据标准化。
print(df.groupby('key').transform(lambda x : x - x.mean()))
data1 data2
0 -1.5 2.0
1 -1.5 -2.5
2 -1.5 0.5
3 1.5 -2.0
4 1.5 2.5
5 1.5 -0.5
6. 应用apply
apply()方法让你可以在每个组上应用任意方法。
例:将第一列数据以第二列的和为基数进行标准化:
def norm_by_data2(x):
x['data1'] /= x['data2'].sum()
return x
print(df.groupby('key').apply(norm_by_data2))
key data1 data2
0 A 0.000000 8
1 B 0.090909 3
2 C 0.181818 6
3 A 0.250000 4
4 B 0.363636 8
5 C 0.454545 5