Pandas GroupBy-在保留原始顺序的同时将功能应用于每个组

劳拉

我想知道是否有一种简单的方法可以将返回与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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章