首页 > 解决方案 > 增量添加 pandas 列值

问题描述

我有一个这样的数据框:

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  

我想执行两件事。

当交易发生在特定日期时添加之前的金额。例如:对于 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。所以最终输出将是这样的:

  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()

但无法在此处获取缺少的日期部分。任何帮助将不胜感激。

标签: pandasdataframepython-3.6

解决方案


用于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

推荐阅读