【发布时间】: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
这完全不是我所期望的。
- 是什么阻止了它变成名为
'A'的系列对象? - 解决此问题最直观的方法是什么?
- 有什么好的理由让我们想要一个单一级别的
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