python - 与多级索引数据框一起使用时 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
类型,所以这不是影响行为的不正确类型的问题。
解决方案
经过一些调查并使用您提供的代码作为示例,并尝试:
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
推荐阅读
- python - UnboundLocalError:分配前引用的局部变量“computed_matrix”
- c - 是否有任何 CHAR_BIT > 8 的托管 C 实现?
- javascript - 未调用 node.js 流完成或错误事件
- spring - 将 Spring 项目转换为 Spring Boot 时面临的问题
- c# - 将要求添加到默认 [授权] 策略
- python - 带有sklearn的python中的决策树将sklearn更改为使用c4.5
- flask - 错误:找不到 Flask 应用程序
- c++ - 如何防止 /* 创建评论块?
- java - 来自 Cosmos DB 的带有异步请求的 GoneException 的原因是什么?
- gnuradio - GNU Radio GFSK 调制和解调