熊猫在groupby数据框上扩展计算

时间:2020-07-27 14:34:05

标签: pandas dataframe pandas-groupby split-apply-combine

我有一个复杂的功能,需要在对分组数据框进行扩展计算时应用。我一直无法上班。

从数据框开始

df = pd.DataFrame(data = {
    "A": np.random.choice([1,2],20),
    "B": np.random.random(20),
    "C": np.random.random(20)
}).sort_values('A').reset_index(drop=True)

看起来像

    A         B         C
0   1  0.969465  0.546566
1   1  0.160205  0.726506
2   1  0.291546  0.103202
3   1  0.827165  0.437247
4   1  0.920561  0.769022
5   1  0.023512  0.063973
6   1  0.402602  0.994032
7   1  0.115942  0.030611
8   1  0.284300  0.211236
9   1  0.273661  0.749363
10  1  0.225167  0.701348
11  2  0.293233  0.553764
12  2  0.124501  0.958893
13  2  0.565157  0.783985
14  2  0.059483  0.037644
15  2  0.363866  0.778230
16  2  0.454548  0.254077
17  2  0.078200  0.463454
18  2  0.110115  0.542749
19  2  0.443635  0.525813

我想应用一个复杂的功能,例如

def my_calc(df):
    return (df['B'] + df['C']).sum()

我尝试了以下

df.groupby("A").expanding(min_periods=3).apply(lambda df: my_calc(df))

df.groupby("A").apply(lambda df: df.expanding(min_periods=3).apply(my_calc))

没有运气。两者都抛出KeyError: 'B'

如何使它工作(这只是一个可重复的示例;我对两列的总和并不真正感兴趣。我需要能够传递分组的数据帧并在这些列上进行操作)? / p>

更新的非内置解决方案:

def my_expanding(df):
    min_periods = 3
    out = np.zeros(shape=(len(df)))
    out[0:min_periods] = np.nan
    for i in range(min_periods, len(df)):
        out[i]=my_calc(df.iloc[0:i])
    return out

grp_calcs = []
for i, grp in enumerate(df.groupby('A')):
    out = my_expanding(grp[1])
    df_calc = pd.DataFrame(data={'D': out}, index=grp[1].index)
    grp_calcs.append(df_calc)

df.join(pd.concat(grp_calcs))

然后我得到了新的扩展计算

    A         B         C          D
0   1  0.039360  0.523758        NaN
1   1  0.731660  0.404238        NaN
2   1  0.938260  0.783231        NaN
3   1  0.967685  0.955865   3.420508
4   1  0.485302  0.005231   5.344057
5   1  0.675959  0.239121   5.834590
6   1  0.746684  0.570507   6.749670
7   1  0.786066  0.730695   8.066861
8   1  0.118654  0.865425   9.583622
9   1  0.326512  0.471045  10.567701
10  1  0.672431  0.801451  11.365258
11  1  0.822955  0.491773  12.839139
12  2  0.983208  0.500876        NaN
13  2  0.930782  0.741006        NaN
14  2  0.218944  0.525081        NaN
15  2  0.669463  0.359917   3.899896
16  2  0.901259  0.557988   4.929277
17  2  0.759114  0.085091   6.388523
18  2  0.342572  0.800106   7.232728
19  2  0.739161  0.738600   8.375406

我该如何使用内置的熊猫函数?

0 个答案:

没有答案