为啥'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 的 strrepr 时获得的视觉线索。

重复一遍:当_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_indexpivotpivot_tablegroupbyDataFrame 方法都可以有这个效果。如果您使用这些方法,则无法阻止列值移动到索引中——毕竟,这是预期的效果!但是,事后,您可以通过调用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参数则删除转化后的数据列)

DataFrame 重新设置索引: reindex 和 reset_index 的区别

pandas操作行集锦

pandas set_index() reset_index()