我有两个 DataFrame A 和 B,它们的列中都有 MultiIndex。然而,B 的列顺序已调换。现在我只想按照与 A 中相同的顺序获取 B 的列。
线索是,顺序取决于 MultiIndex 的第二层。 Pandas 的
reindex()
应该可以做到这一点,但它只对我在 0 级有效,如下所示
df = pd.DataFrame([[1,2,3],[4,5,6]])
df.columns = pd.MultiIndex.from_arrays([["a","b","c"], ["aa","bb","cc"]])
print(df)
输出
a b c
aa bb cc
0 1 2 3
1 4 5 6
多索引的第一级:
df.reindex(columns=["b","a","c"], level=0)
print(df)
b a c
bb aa cc
0 2 1 3
1 5 4 6
第二层:
df = df.reindex(columns=["bb","aa","cc"], level=1)
df
a b c
aa bb cc
0 1 2 3
1 4 5 6
该函数不会引发异常。我也尝试过使用
columns=["bb","aa","cc"], level=2
或 columns=["bb","aa","cc"], level=0
。它输出一个空的 DataFrame,所以我的实现似乎是正确的,但什么也没发生......
我能想到的下一个最佳解决方法是将级别 1 更改为级别 0,但这不是必需的。期待您的想法!
如果您想重新索引这两个级别,只需传递您的 MultiIndex:
A = pd.DataFrame([[1,2,3],[4,5,6]])
A.columns = pd.MultiIndex.from_arrays([["a","b","c"], ["aa","bb","cc"]])
B = pd.DataFrame(columns=pd.MultiIndex.from_arrays([["b","a","c"],
["bb","aa","cc"]]),
index=[0])
out = A.reindex(columns=B.columns)
sort_index
:
order = ["bb","aa","cc"]
out = A.sort_index(level=1, axis=1,
key=pd.Series({v:k for k,v in enumerate(order)}).get)
输出:
b a c
bb aa cc
0 2 1 3
1 5 4 6
分配回 df
df = df.reindex(columns=["b","a","c"], level=0)
df = df.reindex(columns=["bb","aa","cc"], level=1)
print(df)
b a c
bb aa cc
0 2 1 3
1 5 4 6