一条很长的两条线,应该分开:
idx = pd.DatetimeIndex(start=min(df.Date), end=max(df.Date), freq='D')
df2 = (pd.DataFrame(df.set_index(['Date', 'Curr']).unstack('Curr'), index=idx).fillna(0)
+ df.set_index(['Date', 'Curr']).unstack('Curr')).ffill().stack()
>>> df2
Amount
Curr
2015-01-01 AUD 100
USD 100
2015-01-02 AUD 125
USD 125
2015-01-03 AUD 125
USD 125
2015-01-04 AUD 125
USD 125
2015-01-05 AUD 110
USD 110
2015-01-06 AUD 115
USD 115
详细来看,我首先使用原始 DataFrame 中的最小和最大日期创建一个 DatetimeIndex。我将频率设置为每日 ('D'),但您可能希望使用另一个 offset frequency,例如工作日 ('B'):
idx = pd.DatetimeIndex(start=min(df.Date), end=max(df.Date), freq='D')
然后我解开 DataFrame 的堆栈,这样我就只有索引中的日期了。
df_temp = df.set_index(['Date', 'Curr']).unstack('Curr')
>>> df_temp
Amount
Curr AUD USD
Date
1/1/2015 100 100
1/2/2015 125 125
1/5/2015 110 110
1/6/2015 115 115
我创建了一个临时 DataFrame,它将全部是 NaN,但包含我新的扩展日期列表。我用零填充这个 DataFrame 并用 df_temp 中的值覆盖它:
df_temp2 = (pd.DataFrame(df_temp, index=idx).fillna(0) + df_temp)
>>> df_temp2
Amount
Curr AUD USD
2015-01-01 100 100
2015-01-02 125 125
2015-01-03 NaN NaN
2015-01-04 NaN NaN
2015-01-05 110 110
2015-01-06 115 115
最后,我填写值以删除 NaN,并堆叠货币:
>>> df_temp2.ffill().stack()
Amount
Curr
2015-01-01 AUD 100
USD 100
2015-01-02 AUD 125
USD 125
2015-01-03 AUD 125
USD 125
2015-01-04 AUD 125
USD 125
2015-01-05 AUD 110
USD 110
2015-01-06 AUD 115
USD 115