簡體   English   中英

將缺少的日期向前填充到 Python 面板 Pandas Dataframe

[英]Forward filling missing dates into Python Panel Pandas Dataframe

假設我有以下 pandas dataframe:

df = pd.DataFrame({'Date':['2015-01-31','2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30', '2015-04-30'], 'ID':[1,2,2,2,1,2], 'value':[1,2,3,4,5,6]})
print(df)


Date       ID  value
2015-01-31  1   1
2015-01-31  2   2
2015-02-28  2   3
2015-03-31  2   4
2015-04-30  1   5
2015-04-30  2   6

我想轉發填充數據,以便我擁有截至 2015 年 5 月 31 日的每個月底的值(即每個日期 - ID 組合)。 也就是說,我希望 dataframe 如下所示:

Date       ID  value
2015-01-31  1   1
2015-01-31  2   2
2015-02-28  2   3
2015-02-28  1   1
2015-03-31  2   4
2015-03-31  1   1
2015-04-30  1   5
2015-04-30  2   6
2015-05-31  1   5
2015-05-31  2   6

這樣的事情可能嗎? 我在 Stackoverflow 上看到了幾個關於前向填充日期的類似問題,但是這沒有索引列(同一日期可能出現多次)。

您可以pivot然后用reindex + ffill填充值

out = df.pivot(*df.columns).reindex(pd.date_range('2015-01-31',periods = 5,freq='M')).ffill().stack().reset_index()
out.columns = df.columns
out
Out[1077]: 
        Date  ID  value
0 2015-01-31   1    1.0
1 2015-01-31   2    2.0
2 2015-02-28   1    1.0
3 2015-02-28   2    3.0
4 2015-03-31   1    1.0
5 2015-03-31   2    4.0
6 2015-04-30   1    5.0
7 2015-04-30   2    6.0
8 2015-05-31   1    5.0
9 2015-05-31   2    6.0

另一種解決方案:

idx = pd.MultiIndex.from_product(
    [
        pd.date_range(df["Date"].min(), "2015-05-31", freq="M"),
        df["ID"].unique(),
    ],
    names=["Date", "ID"],
)

df = df.set_index(["Date", "ID"]).reindex(idx).groupby(level=1).ffill()
print(df.reset_index())

印刷:

        Date  ID  value
0 2015-01-31   1    1.0
1 2015-01-31   2    2.0
2 2015-02-28   1    1.0
3 2015-02-28   2    3.0
4 2015-03-31   1    1.0
5 2015-03-31   2    4.0
6 2015-04-30   1    5.0
7 2015-04-30   2    6.0
8 2015-05-31   1    5.0
9 2015-05-31   2    6.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM