我有这样的 Pandas 数据框
Date Curr Amount
1/1/2015 USD 100.00
1/2/2015 USD 125.00
1/5/2015 USD 110.00
1/6/2015 USD 115.00
1/1/2015 AUD 100.00
1/2/2015 AUD 125.00
1/5/2015 AUD 110.00
1/6/2015 AUD 115.00
期望的输出
Date curr Amount
1/1/2015 usd 100.00
1/2/2015 usd 125.00
1/3/2015 usd 125.00
1/4/2015 usd 125.00
1/5/2015 usd 110.00
1/6/2015 usd 115.00
1/1/2015 aud 100.00
1/2/2015 aud 125.00
1/3/2015 aud 125.00
1/4/2015 aud 125.00
1/5/2015 aud 110.00
1/6/2015 aud 115.00
源数据只记录了金额的变化,我想插入缺失的日期以及跳过前的金额。
在我的示例中,它从 1/2 跳到 1/5。我希望使用 1/2 金额填写金额列,并为缺失的日期创建 3 行。
谢谢
请您参考如下方法:
一个很长的两个衬里应该被打破:
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
