Pandas df.reindex() 不适用于 MultiIndex 的 level>0

问题描述 投票:0回答:2

我有两个 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,但这不是必需的。期待您的想法!

python pandas dataframe multi-index reindex
2个回答
3
投票

如果您想重新索引这两个级别,只需传递您的 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

0
投票

分配回 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
© www.soinside.com 2019 - 2024. All rights reserved.