【问题标题】:What is going on behind the Pandas scenes that is causing a level in a MultiIndex not to be dropped?Pandas 幕后发生了什么导致 MultiIndex 中的一个级别不被删除?
【发布时间】:2018-09-13 08:06:15
【问题描述】:

考虑数据框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

这完全不是我所期望的。

  1. 是什么阻止了它变成名为'A' 的系列对象?
  2. 解决此问题最直观的方法是什么?
  3. 有什么好的理由让我们想要一个单一级别的MultiIndex

【问题讨论】:

  • 不知道答案,但我很高兴看到这个聪明的问题!
  • 哇...很难将具有一级的 pd.MultiIndex 转换为常规索引。
  • 这里很难回答所有问题...但我找到了解决方法..df.A.iloc[:,0]
  • @Wen 将系列名称保留为 ('A',) 而不是 'A'
  • 这可能是一个错误,因为我怀疑单级 MultiIndex 没有经过很好的测试。以前很难构建一个,因为在您的示例中,MultiIndex.from_product 将返回一个常规的Index。直到 0.21.0 才支持这种行为(请参阅 #17236),这基本上是 pandas 的最后一个版本,因为 0.22.0 只包含一个更改。

标签: python pandas multi-index


【解决方案1】:

我写这个是为了解决这个问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 2013-01-22
    • 2018-02-03
    • 1970-01-01
    • 2021-01-12
    • 2011-10-19
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多