【问题标题】:Deep copy of DataFrame does not remove columnsDataFrame 的深拷贝不删除列
【发布时间】:2015-12-14 23:05:34
【问题描述】:

我希望使用 pd.DataFrame 列的子集进行进一步分析。

在这种情况下,第一个数据帧称为“数据”,深层副本称为“双数据”

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]

给出: 数组([真,真,真,真],dtype=bool)

这不应该是这种情况,因为我刚刚从数据 pd.DataFrame 中删除了 4 个级别 1 列中的 3 个。

我希望遍历 dual_data.columns.levels[1],但现在会遍历 dual_data pd.DataFrame 中甚至不存在的列名。

如何制作列子集的深层副本并在 .levels 中获取正确的列名?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    在进行选择或复制时,您遇到的事实是索引没有“重新计算”(因此级别值重新确定)。
    触发重建索引的解决方法是根据索引中的实际值创建一个新索引 (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

    【讨论】:

    • 工作,太棒了,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2012-04-12
    • 2015-01-13
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多