熊猫多索引数据框累计和

时间:2020-06-19 17:00:41

标签: python pandas

我在下面有一个多索引数据框:

vessels_df.head(10)

                             eta_date
vessel           load_dates  
AM OCEAN SILVER  2020-06-05  2020-06-04
                 2020-06-06 
                 2020-06-07 
                 2020-06-08 
                 2020-06-09 
                 2020-06-10 
                 2020-06-11 
APJ ANGAD 
                 2020-06-09  2020-06-08
                 2020-06-10 
                 2020-06-11 
AQUATONKA       
                 2020-06-03  2020-06-02
                 2020-06-04 
                 2020-06-05 
                 2020-06-06 
                 2020-06-07 
                 2020-06-08 
                 2020-06-09 
                 2020-06-10 
                 2020-06-11 

和一本字典,其中列出了load_dates

的第一天以后每天发生的每日费用
demurrage_charges_dict = {
    'AM OCEAN SILVER': 11076,
    'APJ ANGAD': 21771,
    'AQUATONKA': 14312
}

所需的输出

我想创建一个列,该列是该期间内每日费用的累计总和,例如:

                            eta_date      demurrage_charges
vessel           load_dates  
AM OCEAN SILVER  2020-06-05  2020-06-04   0
                 2020-06-06               11,076
                 2020-06-07               22,152
                 2020-06-08               33,228
                 2020-06-09               44,304
                 2020-06-10               55,380
                 2020-06-11               66,456

我相信我可以重置'vessels_df'的索引,将demurrage_charges_dict转换为df并合并两者,然后使用pd.cumsum(),但我想知道是否还有一种更优雅的执行方式这个吗?

非常感谢。

1 个答案:

答案 0 :(得分:3)

cumcount容器索引级别,并将其乘以容器与dict的映射

idx = df.index.get_level_values('vessel')
df['demurrage_charges'] = (df.groupby(idx).cumcount()
                           * idx.map(demurrage_charges_dict))

                              eta_date  demurrage_charges
vessel          load_dates                               
AM OCEAN SILVER 2020-06-05  2020-06-04                  0
                2020-06-06        None              11076
                2020-06-07        None              22152
                2020-06-08        None              33228
                2020-06-09        None              44304
                2020-06-10        None              55380
                2020-06-11        None              66456
APJ ANGAD       2020-06-09  2020-06-08                  0
                2020-06-10        None              21771
                2020-06-11        None              43542
AQUATONKA       2020-06-03  2020-06-02                  0
                2020-06-04        None              14312
                2020-06-05        None              28624
                2020-06-06        None              42936
                2020-06-07        None              57248
                2020-06-08        None              71560
                2020-06-09        None              85872
                2020-06-10        None             100184
                2020-06-11        None             114496