Python 3.x 为什么“reset_index(drop=True)”函数会意外删除列?

Python 3.x 为什么“reset_index(drop=True)”函数会意外删除列?,python-3.x,pandas,indexing,Python 3.x,Pandas,Indexing,我有一个名为data_match的熊猫数据帧。它包含“\u worker\u id”、“\u unit\u id”和“caption”列。请参阅此数据框中部分行的附加屏幕截图 假设索引列不是升序的,我希望索引是0,1,2,3,4…n,并且我希望它是升序的。因此,我运行了以下函数,试图重置索引列: 数据匹配=数据匹配。重置索引DROP=真 我能够使用Python3.6在我的计算机中获得返回正确输出的函数。然而,当我的同事使用Python 3.6在他的计算机上运行该函数时,“\u worker\u

我有一个名为data_match的熊猫数据帧。它包含“\u worker\u id”、“\u unit\u id”和“caption”列。请参阅此数据框中部分行的附加屏幕截图

假设索引列不是升序的,我希望索引是0,1,2,3,4…n,并且我希望它是升序的。因此,我运行了以下函数,试图重置索引列: 数据匹配=数据匹配。重置索引DROP=真

我能够使用Python3.6在我的计算机中获得返回正确输出的函数。然而,当我的同事使用Python 3.6在他的计算机上运行该函数时,“\u worker\u id”列被删除


这是由于“reset_index”旁边的“drop=True”子句造成的吗?但我不知道为什么它在我的电脑里工作,而不是在我同事的电脑里。有人能提供建议吗

俗话说得好,口译员身上发生的事情就留在你的脑海里 口译译员在没有看到结果的情况下,解释这种差异是不可能的 输入两个Python交互会话的命令的完整历史记录

但是,可以大胆猜测:

删除数据帧的当前索引,并将其替换为 增加整数。它从不掉柱子

因此,在交互式会话中,\u worker\u id是一个列。在你同事的 交互式会话,\u worker\u id必须是索引级别

视觉上的差异可能有些微妙。例如,在下面,df有一个 _当df2具有_worker_id索引级别时,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位于同一行。这是唯一的问题 查看数据帧的str或repr时获得的视觉线索

重复一次:当_worker_index是一列时,该列不受 df.reset_indexdrop=True:

但是_worker_索引作为索引的一部分时会被删除:

In [195]: df2.reset_index(drop=True)
Out[195]: 
   foo
0    1
1    2
2    3

俗话说,在你的口译员身上发生的事情留在你的脑海里 口译译员在没有看到结果的情况下,解释这种差异是不可能的 输入两个Python交互会话的命令的完整历史记录

但是,可以大胆猜测:

删除数据帧的当前索引,并将其替换为 增加整数。它从不掉柱子

因此,在交互式会话中,\u worker\u id是一个列。在你同事的 交互式会话,\u worker\u id必须是索引级别

视觉上的差异可能有些微妙。例如,在下面,df有一个 _当df2具有_worker_id索引级别时,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位于同一行。这是唯一的问题 查看数据帧的str或repr时获得的视觉线索

重复一次:当_worker_index是一列时,该列不受 df.reset_indexdrop=True:

但是_worker_索引作为索引的一部分时会被删除:

In [195]: df2.reset_index(drop=True)
Out[195]: 
   foo
0    1
1    2
2    3

如果您的计算机和同事的计算机都运行Python 3.6,则reset_indexdrop=True肯定会在您的计算机和同事的计算机上工作相同。如果您的计算机和同事的计算机都运行Python 3.6,则reset_indexdrop=True肯定会在您的计算机和同事的计算机上工作相同。而且它不会随机删除一列。谢谢,@unutbu!非常感谢你的回答。我已将您的反馈转达给我的同事,他说这正是发生的事情,“\u worker\u id”列在他运行“reset\u indexdrop=True”函数之前变成了索引列而不是数据帧列。因此,他一定在脚本的前面做了什么,导致“\u worker\u id”成为索引列。有没有一种方法可以强制Python不将数据帧列更改为索引列?有多种方法可以使列值成为索引的一部分。set_索引、pivot、pivot_表、groupby数据帧方法都可以产生这种效果。如果使用这些方法,就无法阻止列值移动到索引中-毕竟,这是预期的效果!但是,事实发生后,您可以通过调用df.reset\u indexdrop=False.Thank,@unutbu!非常感谢你的回答。我已将您的反馈转达给我的同事,他说这正是发生的事情,“\u worker\u id”列在他运行“reset\u indexdrop=True”函数之前变成了索引列而不是数据帧列。因此,他一定在脚本的前面做了什么,导致“\u worker\u id”成为索引列。有没有一种方法可以强制Python不将数据帧列更改为索引列?有多种方法可以使列值成为索引的一部分。set_索引、pivot、pivot_表、groupby数据帧方法都可以产生这种效果。这是不可能的 如果使用这些方法,事件列值将不会移动到索引中-毕竟,这是预期的效果!但是,在这之后,可以通过调用df.reset\u indexdrop=False将索引级别移回列。