首页 > 解决方案 > 通过对列进行分组并对另一列中的先前值求和来创建数据框列

问题描述

我正在寻找一种更简单的方法来创建一个新列,该列表示按 ColA 对数据框进行分组,并且对于 ColB 中的每个日期,将 ColC 中的前两个值相加。下面的例子:

原DF

 ColA      ColB           ColC
 dog       10/13/2021       2
 dog       10/14/2021       1
 dog       10/15/2021       8
 cat       10/12/2021       2 
 cat       10/13/2021       5
 cat       10/14/2021       6
 cat       10/15/2021       1
 frog      10/12/2021       6
 frog      10/13/2021       9
 frog      10/14/2021       2 
 frog      10/15/2021       4

所需的DF

 ColA      ColB           ColC       NewCol
 dog       10/13/2021       2          NaN
 dog       10/14/2021       1           2
 dog       10/15/2021       8           3
 cat       10/12/2021       2          NaN
 cat       10/13/2021       5           2
 cat       10/14/2021       6           7
 cat       10/15/2021       1           11
 frog      10/12/2021       6          NaN
 frog      10/13/2021       9           6
 frog      10/14/2021       2           15
 frog      10/15/2021       4           11

我知道我可以通过遍历 ColA 类别并制作子集数据帧等来做到这一点,但会是几行代码。有人有更快的选择/想法吗?谢谢。

标签: pythonpandasdataframe

解决方案


使用 lambda 函数rollingshift类似:

f = lambda x: x.rolling(2, min_periods=1).sum().shift()
df['new'] = df.groupby('ColA')['ColC'].apply(f).reset_index(level=0, drop=True)
print (df)
    ColA        ColB  ColC   new
0    dog  10/13/2021     2   NaN
1    dog  10/14/2021     1   2.0
2    dog  10/15/2021     8   3.0
3    cat  10/12/2021     2   NaN
4    cat  10/13/2021     5   2.0
5    cat  10/14/2021     6   7.0
6    cat  10/15/2021     1  11.0
7   frog  10/12/2021     6   NaN
8   frog  10/13/2021     9   6.0
9   frog  10/14/2021     2  15.0
10  frog  10/15/2021     4  11.0

或与双重groupby喜欢:

df['new'] = (df.groupby('ColA')['ColC'].rolling(2, min_periods=1).sum()
               .groupby(level=0).shift()
               .reset_index(level=0, drop=True))
print (df)
    ColA        ColB  ColC   new
0    dog  10/13/2021     2   NaN
1    dog  10/14/2021     1   2.0
2    dog  10/15/2021     8   3.0
3    cat  10/12/2021     2   NaN
4    cat  10/13/2021     5   2.0
5    cat  10/14/2021     6   7.0
6    cat  10/15/2021     1  11.0
7   frog  10/12/2021     6   NaN
8   frog  10/13/2021     9   6.0
9   frog  10/14/2021     2  15.0
10  frog  10/15/2021     4  11.0

推荐阅读