增量添加 pandas 列值

Incrementally add pandas column value

我有这样一个数据框:

id  trade_id   tradedate   settledate    amt 
3136  6828     20200616    20200630   15000000.0     
3136  6934     20200616    20200630   15000000.0    
3136  7007     20200618    20200630   30000000.0     
3136  7050     20200620    20200630   25000000.0  
3137  7091     20200612    20200630   25000000.0  
3137  7092     20200615    20200630   25000000.0  

我想做两件事。

当交易发生在特定的 date.Ex:for id 3136 时添加之前的金额 2笔交易发生在6月16日,下一个18日和下一个20日。 所以输出将是:

id   tradedate  amt
3136 20200616   30000000
3136 20200618   60000000
3136 20200620   85000000
3137 20200612   25000000
3137 20200615   50000000

下一个任务是找出缺失的日期并填充上次计算的 amt.So 最终输出将如下所示:

  id   tradedate  amt
    3136 20200616   30000000
    3136 20200617   30000000
    3136 20200618   60000000
    3136 20200619   60000000
    3136 20200620   85000000
    3137 20200612   25000000
    3137 20200613   25000000
    3137 20200614   25000000
    3137 20200615   50000000

我怎样才能有效地实现这一点? 试过这个:

 df_agg = df_joined.groupby(['id', 'tradedate'])[
            'amt'].agg('sum').reset_index()
        df_agg['cumsum'] = df_agg.groupby('id').amt.cumsum()

但无法获取缺失的日期部分 here.Any 将不胜感激。

使用 groupby 得到 idtradedate 的总和,但首先将 tradedate 转换为实际日期以进行上采样:

df['tradedate'] = pd.to_datetime(df['tradedate'], format='%Y%m%d')
>>> df.groupby(['id', 'tradedate'])['amt'].sum() \
      .groupby('id').cumsum().reset_index(level=0) \
      .resample('D').pad().reset_index()

   tradedate    id         amt
0 2020-06-12  3137  25000000.0
1 2020-06-13  3137  25000000.0
2 2020-06-14  3137  25000000.0
3 2020-06-15  3137  50000000.0
4 2020-06-16  3136  30000000.0
5 2020-06-17  3136  30000000.0
6 2020-06-18  3136  60000000.0
7 2020-06-19  3136  60000000.0
8 2020-06-20  3136  85000000.0

尝试:

df_out = df.groupby(['id','tradedate'])['amt'].sum().groupby('id').cumsum().reset_index()

输出:

     id  tradedate         amt
0  3136   20200616  30000000.0
1  3136   20200618  60000000.0
2  3136   20200620  85000000.0
3  3137   20200612  25000000.0
4  3137   20200615  50000000.0

然后,

df_out['tradedate'] = pd.to_datetime(df_out['tradedate'], format='%Y%m%d')
df_out.groupby("id").apply(
    lambda x: x.set_index("tradedate")
               .reindex(pd.date_range(x["tradedate"].min(), x["tradedate"].max(), freq="D"))
               .reset_index()
               .ffill()
).reset_index(drop=True)

输出:

       index      id         amt
0 2020-06-16  3136.0  30000000.0
1 2020-06-17  3136.0  30000000.0
2 2020-06-18  3136.0  60000000.0
3 2020-06-19  3136.0  60000000.0
4 2020-06-20  3136.0  85000000.0
5 2020-06-12  3137.0  25000000.0
6 2020-06-13  3137.0  25000000.0
7 2020-06-14  3137.0  25000000.0
8 2020-06-15  3137.0  50000000.0

给这只猫剥皮的方法有很多,但这是我的解决方案>

df.tradedate  = pd.to_datetime(df.tradedate, format='%Y%m%d')
(df.
 groupby(['id', 'tradedate'])['amt'].
 sum().
 groupby('id').
 cumsum().
 reset_index().
 set_index('tradedate').
 groupby('id').
 apply(lambda x: x.drop('id',axis=1).asfreq('D', method= 'ffill')).
 reset_index()
 )