我有一个复杂的功能,需要在对分组数据框进行扩展计算时应用。我一直无法上班。
从数据框开始
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
我该如何使用内置的熊猫函数?