[英]Can I resample (ffill) pandas DataFrame with MultiIndex
我有一個看起來像這樣的數據框,帶有一個 MultiIndex over ('timestamp', 'id')
:
value
timestamp id
2020-03-03 A 100
2020-03-03 B 222
2020-03-03 C 5000
2020-03-04 A NaN
2020-03-04 B 1
2020-03-04 C NaN
2020-03-05 A 200
2020-03-05 B NaN
2020-03-05 C NaN
2020-03-06 A NaN
2020-03-06 B 20
2020-03-06 C NaN
我想在value
上轉發填充(按時間),以便數據框填充最新可用的數據項,即數據框變為:
value
timestamp id
2020-03-03 A 100
2020-03-03 B 222
2020-03-03 C 5000
2020-03-04 A 100
2020-03-04 B 1
2020-03-04 C 5000
2020-03-05 A 200
2020-03-05 B 1
2020-03-05 C 5000
2020-03-06 A 200
2020-03-06 B 20
2020-03-06 C 5000
有沒有簡單的方法使用重采樣器?
您可以對第二級和 ffill 進行排序,然后像原始一樣重新索引:
df.sort_index(level=1).ffill().reindex(df.index)
value
timestamp id
2020-03-03 A 100.0
B 222.0
C 5000.0
2020-03-04 A 100.0
B 1.0
C 5000.0
2020-03-05 A 200.0
B 1.0
C 5000.0
2020-03-06 A 200.0
B 20.0
C 5000.0
您還可以使用stack
以正確的 2D 表示形式排列數據以進行填充(按列),然后將stack
解壓回原始格式。 這將單獨處理列(即索引),而不是滾動數據值,這是給出的其他解決方案中的情況。
a = ['2020-03-03','2020-03-04','2020-03-05', '2020-03-06']
b = ['A', 'B', 'C']
c = ['value1', 'value2']
df = pd.DataFrame(data=None, index=pd.MultiIndex.from_product([a,b]), columns=c)
df.loc[('2020-03-03', slice(None)), 'value1'] = np.array([100, 222, 5000])
df.loc[('2020-03-04', 'B'), 'value1'] = 1.0
df.loc[('2020-03-05', 'A'), 'value1'] = 200.0
df.loc[('2020-03-06', 'C'), 'value1'] = 20
df['value2'] = df['value1']
df.loc[('2020-03-03', 'C'), 'value2'] = np.nan
df
value1 value2
timestamp id
2020-03-03 A 100 100
2020-03-03 B 222 222
2020-03-03 C 5000 NaN # <- OBS!
2020-03-04 A NaN NaN
2020-03-04 B 1 1
2020-03-04 C NaN NaN
2020-03-05 A 200 200
2020-03-05 B NaN NaN
2020-03-05 C NaN NaN
2020-03-06 A NaN NaN
2020-03-06 B 20 20
2020-03-06 C NaN NaN
使用df.unstack().fillna(method='ffill')
給出
value1 value2
A B C A B C
timestamp
2020-03-03 100 222 5000 100 222 NaN
2020-03-04 100 1 5000 100 1 NaN
2020-03-05 200 1 5000 200 1 NaN
2020-03-06 200 1 20 200 1 20
這可以通過.stack()
再次恢復到原始格式。
將此與df.sort_index(level=1).ffill().reindex(df.index)
,不同之處在於最后一列,因為 'C' 以NaN
開頭,因此 'B' 的值為 1 的值被滾動到'Value2' 的 'C' 開頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.