我有一個包含多個時間序列的資料框,如下所示:
| 日期 | 物品 | 類別 |
|---|---|---|
| 2021-01-01 | 豪達 | 起司 |
| 2021-01-02 | 豪達 | 起司 |
| 2021-01-04 | 豪達 | 起司 |
| 2021-01-05 | 豪達 | 起司 |
| 2021-02-01 | 生菜 | 生產 |
| 2021-02-02 | 生菜 | 生產 |
| 2021-02-03 | 生菜 | 生產 |
| 2021-02-05 | 生菜 | 生產 |
我想為缺少的日期添加行(例如,gouda 為 2021-01-03,生菜為 2021-02-04)。請注意,這些系列不一定在同一日期開始和結束。
在熊貓中做到這一點的最佳方法是什么?我還想用該系列的“專案”和“類別”列中的值填充新行。
uj5u.com熱心網友回復:
Item按和分組Category,然后生成從最小日期到最大日期的時間序列:
result = (
df.groupby(["Item", "Category"])["Date"]
.apply(lambda s: pd.date_range(s.min(), s.max()))
.explode()
.reset_index()
)
uj5u.com熱心網友回復:
你可以做resample
df['Date'] = pd.to_datetime(df['Date'])
df['Y-m'] = df['Date'].dt.strftime('%y-%m')
out = df.groupby('Y-m').apply(lambda x : x.set_index('Date').resample('D').ffill()).reset_index(level=1)
uj5u.com熱心網友回復:
這是使用groupby.apply. 這個想法是首先使用groupby.agg找到每個“專案”的最大和最小日期。然后groupby再次使用應用添加缺失日期的 lambda date_range:
df['Date'] = pd.to_datetime(df['Date'])
g = df.groupby('Item')
dates = g['Date'].agg(['min','max'])
out = (g.apply(lambda x: x.set_index('Date')
.reindex(pd.date_range(*dates.loc[x.name])).ffill())
.droplevel(0).rename_axis(['Date']).reset_index())
輸出:
Date Item Category
0 2021-01-01 gouda cheese
1 2021-01-02 gouda cheese
2 2021-01-03 gouda cheese
3 2021-01-04 gouda cheese
4 2021-01-05 gouda cheese
5 2021-02-01 lettuce produce
6 2021-02-02 lettuce produce
7 2021-02-03 lettuce produce
8 2021-02-04 lettuce produce
9 2021-02-05 lettuce produce
uj5u.com熱心網友回復:
這遠非最佳,但我會這樣做以確保所有類別和專案都在最小和最大周期內,并且所有范圍都已填充:
aux = []
for x in df['Item'].unique():
_ = pd.DataFrame({'Date':pd.date_range(df[df['Item']==x]['Date'].min(),df[df['Item']==x]['Date'].max(),freq='d')})
_['Item'] = x
_['Category'] = df[df['Item']==x]['Category'].values[0]
aux.append(_)
output = pd.concat(aux)
考慮這個示例資料集:
df = pd.DataFrame({'Date':['2021-01-01','2021-01-02','2021-01-04','2021-01-05','2021-01-01','2021-01-02','2021-01-04','2021-01-05'],
'Item':['gouda','gouda','gouda','gouda','lettuce','lettuce','lettuce','lettuce'],
'Category':['cheese','cheese','cheese','cheese','produce','produce','produce','produce']})
df['Date'] = pd.to_datetime(df['Date'],infer_datetime_format=True)
輸出:
Date Item Category
0 2021-01-01 gouda cheese
1 2021-01-02 gouda cheese
2 2021-01-03 gouda cheese
3 2021-01-04 gouda cheese
4 2021-01-05 gouda cheese
0 2021-01-01 lettuce produce
1 2021-01-02 lettuce produce
2 2021-01-03 lettuce produce
3 2021-01-04 lettuce produce
4 2021-01-05 lettuce produce
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456774.html
