考虑数据帧df请注意,columns对象是单级MultiIndex。

midx = pd.MultiIndex.from_product([list('AB')])
df = pd.DataFrame(1, range(3), midx)

   A  B
0  1  1
1  1  1
2  1  1

现在当我引用'A'列时
df.A

   A
0  1
1  1
2  1

我得到一个单列数据框,而不是我期望的系列对象。因此,我可以无限期地引用此专栏。
df.A.A.A.A.A

   A
0  1
1  1
2  1

作为另一项检查,我使用了xs
df.xs('A', axis=1)

   A
0  1
1  1
2  1

同样的问题。pd.IndexSlice
df.loc[:, pd.IndexSlice['A']]

   A
0  1
1  1
2  1
squeeze怎么样
df.A.squeeze()

0    1
1    1
2    1
Name: (A,), dtype: int64

这根本不是我所期望的。
  • 是什么阻止了它变成名称为'A'的系列对象?
  • 解决此问题的最直观的方法是什么?
  • 是否有充分的理由为什么我们应该想要一个单层的MultiIndex
  • 最佳答案

    我写这个来解决这个问题。

    def fix_single_level_multiindex(midx):
        return midx.get_level_values(0) if midx.nlevels == 1 else midx
    

    或者
    def fix_single_level_multiindex(midx):
        return midx.levels[0][midx.labels[0]] if midx.nlevels == 1 else midx
    

    10-06 13:34