我在下面有一个多索引数据框:
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()
,但我想知道是否还有一种更优雅的执行方式这个吗?
非常感谢。
答案 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