![](/img/trans.png)
[英]Reindex Multiindex dataframe on a specific level based on other dataframe index
[英]Reindex 3rd level of Multiindex DataFrame where second-level index is irregular
我想重新索引DataFrame的第三級,其中索引的第二級不遵循任何模式。 我需要一個Multiindex對象來重新索引一個多索引的DataFrame ,但是我在構建它時遇到了麻煩。 我讀了這個問題 ,但是Multiindex遵循一種模式,可以從pd.Multiindex.from_product()
構造。 在我的情況下,第二級取決於第一級,但不遵循模式。 基本上,我只想重用Multiindex的前兩個級別,即只在第三個級別上重新索引。
一個帶有虛構數字的示例(原始DataFrame的長度約為10,000行):
df = pd.DataFrame({'Alt':[2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000],
'Mn':[0.235, 0.235, 0.554, 0.554, 0.328, 0.328, 0.764, 0.764,
0.245, 0.245, 0.587, 0.587, 0.376, 0.376, 0.802, 0.802],
'Fact':[1.2, 1.3, 1.2, 1.3, 1.2, 1.3, 1.2, 1.3,
1.2, 1.3, 1.2, 1.3, 1.2, 1.3, 1.2, 1.3],
'Val':[10, 12, 8, 9, 6, 7, 4, 5,
9, 11, 7, 8, 5, 6, 3, 4]})
df = df.set_index(['Alt', 'Mn', 'Fact'])
df
Val
Alt Mn Fact
2000 0.235 1.2 10
1.3 12
0.554 1.2 8
1.3 9
0.328 1.2 6
1.3 7
0.764 1.2 4
1.3 5
4000 0.245 1.2 9
1.3 11
0.587 1.2 7
1.3 8
0.376 1.2 5
1.3 6
0.802 1.2 3
1.3 4
我想要的解決方案如下所示:
new_facts = [1.2, 1.25, 1.3]
df = df.reindex(new_facts, level='Fact')
df
Val
Alt Mn Fact
2000 0.235 1.2 10
1.25 NaN
1.3 12
0.554 1.2 8
1.25 NaN
1.3 9
0.328 1.2 6
1.25 NaN
1.3 7
0.764 1.2 4
1.25 NaN
1.3 5
4000 0.245 1.2 9
1.25 NaN
1.3 11
0.587 1.2 7
1.25 NaN
1.3 8
0.376 1.2 5
1.25 NaN
1.3 6
0.802 1.2 3
1.25 NaN
1.3 4
最終目標是對Val
列執行插值。
編輯
如對這個問題的回答所述, reindex
函數應接受一個級別參數(例如上面的“理想解決方案”中的參數),但是由於某種原因,這不起作用,並且輸出DataFrame保持不變。
我上周有一個類似的問題(請參閱pandas multi-index中的Upsample ):
如果按照說明使用df,則可以執行以下操作:
def reindex_df(x, vals):
lvl0 = x.index.get_level_values(0)[0]
lvl1 = x.index.get_level_values(1)[0]
lvl2 = x.index.get_level_values(2)
lvl2 = np.unique(np.concatenate((np.array(lvl2), np.array(vals))))
mux = pd.MultiIndex.from_product([[lvl0], [lvl1], lvl2 ], names=x.index.names)
return (x.reindex(mux))
df.groupby(level=[0, 1], group_keys=False).apply(reindex_df, [1.2, 1.25, 1.3])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.