pandas - 添加聚合功能

我在 pandas 中有这个数据框:


   day customer  amount

0    1    cust1     500

1    2    cust2     100

2    1    cust1      50

3    2    cust1     100

4    2    cust2     250

5    6    cust1      20

我想创建一个新列“amount2days”,以便汇总过去两天每个客户的金额,以获得以下数据框:


   day customer  amount    amount2days   ----------------------------

0    1    cust1     500    500           (no past transactions)

1    2    cust2     100    100           (no past transactions)

2    1    cust1      50    550           (500 + 50 = rows 0,2 

3    2    cust1     100    650           (500 + 50 + 100, rows 0,2,3)

4    2    cust2     250    350           (100 + 250, rows 1,4) 

5    6    cust1      20    20            (notice day is 6, and no day=5 for cust1)

即我想执行以下(伪)代码:


df['amount2days'] = df_of_past_2_days['amount'].sum()

对于每一行。最方便的方法是什么?


我希望在一天内执行求和,但天数不一定必须在每个新行中增加,如示例所示。我仍然想总结过去两天的金额。


一只名叫tom的猫
浏览 69回答 1
1回答

呼如林

我认为这只是几天的滚动:def get_roll(x):    s = pd.Series(x['amount'].values,                   index=pd.to_datetime('1900-01-01') + pd.to_timedelta(x['day'], unit='D')                 )    return pd.Series(s.rolling('2D').sum().values, index=x.index)df['amount2days'] = (df.groupby('customer').apply(get_roll)                       .reset_index(level=0, drop=True)                    )输出:   day customer  amount  amount2days1    1    cust1     500        500.02    1    cust2     100        100.03    1    cust1      50        550.04    2    cust1     100        650.05    2    cust2     250        350.06    3    cust1      20        120.0选项 2:由于您只想计算两天的累计金额,因此今天的金额仅加上前一天的金额。所以我们可以利用shift:df['amount2days'] = df.groupby(['customer','day'])['amount'].cumsum()# shift the last item of the previous day and adddf['amount2days'] += (df.drop_duplicates(['day','customer'],keep='last')   .groupby(['customer'])['amount2days'].shift()   .reindex(df.index)   .ffill()   .fillna(0))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python