gpt4 book ai didi

python - Pandas GroupBy - 将函数应用于每个组,同时保留原始顺序

转载 作者:行者123 更新时间:2023-12-04 10:38:13 24 4
gpt4 key购买 nike

我想知道是否有一种简单的方法可以将返回与 DataFrame 长度相同的 Series 的函数应用于 DataFrame 中的每个组,同时保留索引的原始顺序。

这是一个玩具 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

应用仅依赖于 的函数很容易一 列并返回单个排序的系列。例如:
>>> 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

但是,如果函数依赖于多个列,则结果是一个不保留顺序的多索引系列:
>>> 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

这个循环 + 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

关于python - Pandas GroupBy - 将函数应用于每个组,同时保留原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60063383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com