我想知道是否有一种简单的方法可以将返回与DataFrame长度相同的Series的函数应用于DataFrame中的每个组,同时保留索引的原始顺序。
这是一个玩具数据框,我将使用它来给出一个示例:
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.rand(10,2),columns=['x1','x2'])
>>> df['group'] = np.random.choice(list('ABC'),size=10)
>>> df
x1 x2 group
0 0.710005 0.632971 C
1 0.384604 0.417906 C
2 0.307053 0.869622 C
3 0.699528 0.026040 A
4 0.773514 0.391718 C
5 0.602334 0.936036 C
6 0.872275 0.162393 C
7 0.641256 0.147996 B
8 0.047188 0.358093 C
9 0.059955 0.353174 B
应用仅依赖一列的函数并返回单个已排序的Series足够容易。例如:
>>> df.groupby('group')['x1'].apply(lambda x: (x-x.mean())/x.std())
0 0.618951
1 -0.488499
2 -0.752430
3 NaN
4 0.835095
5 0.252510
6 1.171211
7 0.707107
8 -1.636838
9 -0.707107
但是,如果函数依赖于多列,则结果是不保留顺序的多索引Series:
>>> df.groupby('group').apply(lambda grp: grp['x1']/grp['x2'].mean())
group
A 3 26.863693
B 7 2.559033
9 0.239262
C 0 1.318752
1 0.714357
2 0.570315
4 1.436714
5 1.118766
6 1.620150
8 0.087646
当所需的输出改为:
>>> res = []
>>> for idx, grp in df.groupby('group'):
... res.append(grp['x1'] / grp['x2'].mean())
...
>>> pd.concat(res).sort_index()
0 1.318752
1 0.714357
2 0.570315
3 26.863693
4 1.436714
5 1.118766
6 1.620150
7 2.559033
8 0.087646
9 0.239262
这个loop + concat完成了所需的操作,只是想知道是否有一种更优雅的使用方式apply
。
我不确定您是否需要apply
在这里使用,但始终可以Series.sort_index
在最后使用:
df.groupby('group').apply(lambda grp: grp['x1']/grp['x2'].mean()).sort_index(level = 1)
group
B 0 0.946438
C 1 2.273879
A 2 0.167197
3 1.378490
C 4 0.320788
5 0.085125
A 6 1.165615
B 7 1.622586
C 8 1.763416
9 1.817172
Name: x1, dtype: float64
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句