我希望使用pd.DataFrame的一部分列进行进一步分析。
在这种情况下,第一个数据帧称为“数据”,深层副本称为“dual_data”
dual_data = data[[column for column in data.columns if 'AbCd' in column]].copy(deep=True)
然而,之后我发现:
data.columns.levels[1] == dual_data.columns.levels[1]
给出: array([True,True,True,True],dtype = bool)
不应该是这种情况,因为我刚从数据pd.DataFrame中删除了4个1级列中的3个。
我希望循环遍历dual_data.columns.levels [1],但现在循环遍历在dual_data pd.DataFrame中甚至不存在的列名。
如何制作列子集的深层副本并在.levels中获取正确的列名?
答案 0 :(得分:4)
在进行选择或复制时,您遇到的事实是“未重新计算”索引(以及重新确定的级别值)。
触发重建索引的解决方法是根据索引(data.columns.values
)中的实际值创建新索引。
考虑这个例子:
In [3]: data = pd.DataFrame(np.random.randn(2,6), columns=pd.MultiIndex.from_product([['A', 'B', 'C'], ['a', 'b']]))
In [4]: data
Out[4]:
A B C
a b a b a b
0 0.050503 0.345575 0.293645 0.125889 -0.739698 0.690166
1 1.152101 0.893495 -0.787171 -1.464624 -0.334374 -0.919670
In [5]: data2 = data[[column for column in data.columns if 'A' in column]]
In [6]: data2
Out[6]:
A
a b
0 0.050503 0.345575
1 1.152101 0.893495
In [7]: data2.columns.levels
Out[7]: FrozenList([[u'A', u'B', u'C'], [u'a', u'b']])
正如您在问题中所述,上面的levels
仍然包含原始级别值。要获得“干净”级别,您可以手动重建索引并分配它:
In [9]: data2.columns = pd.MultiIndex.from_tuples(data2.columns.values)
In [10]: data2
Out[10]:
A
a b
0 0.050503 0.345575
1 1.152101 0.893495
In [11]: data2.columns.levels
Out[11]: FrozenList([[u'A'], [u'a', u'b']])
有关此问题的一些讨论,另请参阅https://github.com/pydata/pandas/issues/2770。