为啥'reset_index(drop = True)'函数会意外删除列?
Posted
技术标签:
【中文标题】为啥\'reset_index(drop = True)\'函数会意外删除列?【英文标题】:Why did 'reset_index(drop=True)' function unwantedly remove column?为什么'reset_index(drop = True)'函数会意外删除列? 【发布时间】:2017-11-21 01:46:19 【问题描述】:我有一个名为 data_match 的 Pandas 数据框。它包含列“_worker_id”、“_unit_id”和“标题”。 (有关此数据框中的某些行,请参阅随附的屏幕截图)
假设索引列不是升序(我希望索引为 0、1、2、3、4...n)并且我希望它是升序。所以我运行以下函数尝试重置索引列:
data_match=data_match.reset_index(drop=True)
我能够使用 Python 3.6 获得在我的计算机中返回正确输出的函数。但是,当我的同事使用 Python 3.6 在他的计算机上运行该函数时,“_worker_id”列被删除了。
这是因为reset_index
旁边的(drop=True)
子句吗?但我不知道为什么它在我的电脑上工作,而不是在我同事的电脑上工作。有人可以建议吗?
【问题讨论】:
reset_index(drop=True) 如果两者都运行 Python 3.6,那么在您的计算机和您同事的计算机上肯定会同样工作。而且它不会丢弃随机列。 【参考方案1】:俗话说,“在你的翻译中发生的事情留在你的 口译员”。如果没有看到 输入到两个 Python 交互式会话中的命令的完整历史记录。
不过,可以大胆猜测一下:
df.reset_index(drop=True)
删除 DataFrame 的当前索引并将其替换为索引
递增整数。它从不丢弃列。
因此,在您的交互式会话中,_worker_id
是一列。在你同事的
交互式会话,_worker_id
必须是索引级别。
视觉差异可能有些微妙。例如,在下面,df
有一个
_worker_id
列,而 df2
具有 _worker_id
索引级别:
In [190]: df = pd.DataFrame('foo':[1,2,3], '_worker_id':list('ABC')); df
Out[190]:
_worker_id foo
0 A 1
1 B 2
2 C 3
In [191]: df2 = df.set_index('_worker_id', append=True); df2
Out[191]:
foo
_worker_id
0 A 1
1 B 2
2 C 3
请注意,名称 _worker_id
出现在 foo
下方的一行时,它是
索引级别,当它是列时,与foo
在同一行。那是唯一的
查看 DataFrame 的 str
或 repr
时获得的视觉线索。
重复一遍:当_worker_index
是一个列时,该列不受
df.reset_index(drop=True)
:
In [194]: df.reset_index(drop=True)
Out[194]:
_worker_id foo
0 A 1
1 B 2
2 C 3
但_worker_index
是索引的一部分时会被删除:
In [195]: df2.reset_index(drop=True)
Out[195]:
foo
0 1
1 2
2 3
【讨论】:
谢谢,@unutbu!非常感谢您的回答。我已将您的反馈转达给我的同事,他说这正是发生的情况,在他运行“reset_index(drop=True)”函数之前,“_worker_id”列成为索引列而不是数据框列。所以他一定是在脚本的前面做了一些事情,导致“_worker_id”成为索引列。有没有一种方法可以强制 Python 不将数据框列更改为索引列? 列值成为索引的一部分的方式不止一种。set_index
、pivot
、pivot_table
、groupby
DataFrame 方法都可以有这个效果。如果您使用这些方法,则无法阻止列值移动到索引中——毕竟,这是预期的效果!但是,事后,您可以通过调用df.reset_index(drop=False)
将索引级别移回列。以上是关于为啥'reset_index(drop = True)'函数会意外删除列?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas中set_index和reset_index的用法及区别
pandas读取csv数据使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据设置drop参数则删除转化后的数据列)
pandas读取csv数据使用reset_index函数把行索引重置为列数据(level参数设置将原行索引中的指定层转化为列数据设置drop参数则删除转化后的数据列)