Python-Pandas:创建一个新列,该列是另一列的组的聚合和,条件是日期列

c2e8gylq  于 2023-01-28  发布在  Python
关注(0)|答案(2)|浏览(101)

样本数据:
| 色谱柱A|B栏|C栏|
| - ------|- ------|- ------|
| 比尔|1个|2022年9月1日|
| 约翰|无|2022年9月2日|
| 比尔|1个|2022年9月4日|
| 比尔|无|2022年9月10日|
我想创建一个列,其中列B基于列A求和...但仅限于列C小于或等于当前行的示例。
我想要的:
| 色谱柱A|B栏|C栏|新列|
| - ------|- ------|- ------|- ------|
| 比尔|1个|2022年9月1日|无|
| 约翰|无|2022年9月2日|无|
| 比尔|1个|2022年9月4日|1个|
| 比尔|无|2022年9月10日|第二章|
因此,新列是在列A上分组的列B的总和,但它只是对列C中早于当前行的日期的列B求和。因此,在上面的最后一行中,Bill在NEW COL中有一个2,因为列B是对2022 - 09 - 10之前的所有示例求和的。
我使用groupby进行基本聚合:

df.groupby('Column A')['Column B'].transform(np.sum)

但是这并没有考虑到日期,我被困在是否使用groupby或者是否需要使用lambda函数来代替。

4ioopgfo

4ioopgfo1#

试试这个。

df['NEW COL'] = (df.groupby('Column A')
                   .apply(lambda x: x[x['Column C'] <= x['Column C']]
                   .sum()['Column B']))
5m1hhzi4

5m1hhzi42#

您可能希望每组有一个移位的cumsum

df['NEW COL'] = (df
   .sort_values(by='Column C')
   .groupby('Column A')['Column B']
   .transform(lambda s: s.cumsum().shift(fill_value=0))
)

输出:

Column A  Column B    Column C  NEW COL
0     Bill         1  2022-09-01        0
1     John         0  2022-09-02        0
2     Bill         1  2022-09-04        1
3     Bill         0  2022-09-10        2
处理重复日期
df2 = (df
   .groupby(['Column A', 'Column C'], as_index=False)['Column B'].sum()
   .sort_values(by='Column C')
)
    
out = df.merge(df2.join(df2.groupby('Column A', group_keys=False)['Column B']
                           .apply(lambda s: s.cumsum().shift(fill_value=0))
                           .rename('NEW COL')
                       ).drop(columns='Column B'),
               on=['Column A', 'Column C'], how='left'
               )

输出:

Column A  Column B    Column C  NEW COL
0     Bill         1  2022-09-01        0
1     John         0  2022-09-02        0
2     Bill         1  2022-09-04        1
3     Bill         1  2022-09-10        2
4     Bill         0  2022-09-10        2
5     Bill         1  2022-09-11        3

相关问题