Pandas如何按姓名、供应商分组对连续日期数值求和并新增列
要实现同姓名、同供应商分组下连续日期的Amount求和,可按以下步骤操作:
步骤1:日期格式转换
先把Date列转为pandas支持的datetime格式,才能计算日期间隔:
import pandas as pd # 示例DataFrame df = pd.DataFrame({'Name': ['A', 'A', 'A','A','B','B','C','C','C','C','C','C','C','C','C'], 'Supplier': ['Wal', 'Wal', 'Wal', 'Wal', 'Co', 'Co', 'Mc', 'Mc', 'St', 'St', 'St', 'St', 'St', 'To', 'To'], 'Date': ['2021-05-31', '2021-06-01', '2021-06-08', '2021-06-09', '2021-05-17', '2021-05-18' , '2021-04-07', '2021-04-08', '2021-05-11', '2021-05-12', '2021-05-13', '2021-05-18' , '2021-05-19', '2021-03-30', '2021-03-31'], 'Amount': [27, 400, 410, 250, 100, 50, 22, 78, 60, 180, 100, 240, 140, 30, 110], 'Summation': [427,427,660,660,150,150,100,100,340,340,340,380,380,140,140 ]}) # 转换日期格式 df['Date'] = pd.to_datetime(df['Date'])
步骤2:生成连续日期段标记
按姓名、供应商分组后,计算每行日期和上一行的间隔,间隔不等于1天就标记为新的连续段,用累计求和生成每个连续段的唯一标识:
df['continue_group'] = df.groupby(['Name', 'Supplier'])['Date'].diff().dt.days.ne(1).cumsum()
步骤3:分组求和生成结果列
按姓名、供应商、连续段标识三个维度分组,对Amount求和后用transform方法把结果同步到同组的每一行:
df['new_summation'] = df.groupby(['Name', 'Supplier', 'continue_group'])['Amount'].transform('sum')
可选:清理临时列
如果不需要刚才生成的连续段标记列,可以直接删除:
df = df.drop('continue_group', axis=1)
最终得到的new_summation列和示例中的Summation列结果完全一致,符合需求。
内容的提问来源于stack exchange,提问作者Rouzbeh Talebi
相关产品推荐
相关产品推荐

