Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与多级索引数据帧一起使用时pd.DataFrame.drop的意外行为_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 与多级索引数据帧一起使用时pd.DataFrame.drop的意外行为

Python 与多级索引数据帧一起使用时pd.DataFrame.drop的意外行为,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,在pandas中从多索引数据框中删除一列后,我遇到了一个意外的行为 在删除列之后,我需要获取多索引数据帧的最外层(level=0)列。为了得到level=0列,我使用了: df.columns.levels[0] 然而,即使在从原始数据帧中删除特定列并将其分配给新的数据帧之后,我仍然在索引列表中获得相同的元素,而不是更新的列列表 例如: INPUT: df Box '1' '2' '3' Latency co

在pandas中从多索引数据框中删除一列后,我遇到了一个意外的行为

在删除列之后,我需要获取多索引数据帧的最外层(level=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.
我不确定这是一个bug还是我做错了什么。。。 为什么更新的数据帧(
dropped_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.
事实上,正如本文所述:

构造用于表示多索引级别、标签和名称。其目的是防止修改这些thru属性并强制使用方法(例如set_levels())。因为它们的状态不能单独更改(对于标高/标签),但必须一起更改


解释为什么当我们看到
dropped\u df.columns.levels[1]
时,我们会得到冻结(原始)值,而不是简单显示
dropped\u df时所看到的值

你能试试
dropped\u df=df.drop(2,轴=1,级别=0)
,这些列可能是int而不是string?这些列是string,因为我就是这样格式化原始数据帧的。此外,如果列是int,则不会在.drop()之后删除这些列,
drop\u df
将与
df
相同。但是我会编辑我的原始帖子来澄清数据类型是的,我刚刚做了,我得到了和他一样的结果。数据框会更新,但打印
.columns.levels[0]
不会更新。我也试着在
.drop()
中传递
inplace=True
,但是“bug”一直在发生,我想我有进展了。。。将在几天后发布。是的,谢谢@CeliusStingher!我明白了-谢谢你的回答!这完全有道理。也许我应该创建一个问题,请求在输出级别将
索引
替换为
冻结列表
,以便像我这样的人可以更快地调试。输出
索引
肯定有点误导。但我想这会让我想到另一个问题,如何变异冻结列表中的元素?有没有一种方法可以为其他可变数据类型创建冻结列表?或者我必须坚持使用set_levels()?在我看来,它需要额外的导入,
frozenlist
项目似乎解决了这个问题,看看吧:谢谢你的指针@Celius。我一定会看看这个项目
TypeError: 'FrozenList' does not support mutable operations.