首页 > 解决方案 > 与多级索引数据框一起使用时 pd.DataFrame.drop 的意外行为

问题描述

从熊猫的多索引数据框中删除一列后,我遇到了意外行为。

删除一列后,我需要获取多索引数据框的最外层(级别 = 0)列。为了获得 level=0 列,我使用了:

df.columns.levels[0]

但是,即使从原始数据框中删除特定列并将其分配给新数据框,我仍然会在索引列表中获得相同的元素,而不是更新的列列表。

例如:

INPUT: df
Box       '1'                  '2'                   '3'
Latency   code latency  loc    code latency  loc    code latency  loc
0         9170.  948.    L.    8170.  328.    R.    9160.  238.    L.
1         7540   1501.   R     9170.  9028.   L.    7170.   94.    L.
INPUT:df.columns.levels[0]
Out: Index(['1', '2', '3'], dtype='object', name='Box Number')



dropped_df = df.drop('2', axis=1, level=0)
INPUT: dropped_df.columns.levels[0]
Out: Index(['1', '2', '3'], dtype='object', name='Box Number')


INPUT: dropped_df
Out: 
Box       '1'                  '3'                  
Latency   code latency  loc    code latency  loc
0         9170.  948.    L.    9160.  238.    L.
1         7540   1501.   R     7170.   94.    L.

我不确定这是一个错误还是我做错了什么......为什么更新的数据帧(dropped_df)返回与原始数据帧相同的列,即使更新的 df 的输出显示数据帧已经改变了吗?原始数据帧是否在某处缓存(复制)?

任何帮助/指针将不胜感激!

注意:我使用的是 python =3.6.8。/熊猫=0.25.0

编辑 1:列是string类型,所以这不是影响行为的不正确类型的问题。

标签: pythonpython-3.xpandasdataframe

解决方案


经过一些调查并使用您提供的代码作为示例,并尝试:

dropped_df.columns.levels[1] = dropped_df.columns.levels[1]

我收到以下错误:

TypeError: 'FrozenList' does not support mutable operations.

研究熊猫文档似乎确实如本答案所述:

该构造用于表示 MultiIndex 级别、标签和名称。它的重点是防止通过属性修改这些属性并强制使用方法(例如 set_levels())。由于这些状态不能独立更改(对于级别/标签),但必须一起更改。

解释为什么当我们看到dropped_df.columns.levels[1]我们得到 Frozen (原始)值,而不是我们在简单显示时看到的dropped_df


推荐阅读