为什么熊猫 reindex() 不能就地运行?

Lui*_*uis 12 python dataframe pandas reindex

重新索引文档

使用可选的填充逻辑使 DataFrame 符合新索引,将 NA/NaN 放置在前一个索引中没有值的位置。除非新索引与当前索引等效并且 copy=False,否则将生成一个新对象。

因此,我认为我会Dataframe通过设置copy=False 到位 (!) 来重新排序。但是,看来我确实得到了一个副本,并且需要再次将其分配给原始对象。如果我可以避免它,我不想将它分配回来(原因来自另一个问题)。

这就是我正在做的:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(5, 5))

df.columns = [ 'a', 'b', 'c', 'd', 'e' ]

df.head()
Run Code Online (Sandbox Code Playgroud)

出局:

          a         b         c         d         e
0  0.234296  0.011235  0.664617  0.983243  0.177639
1  0.378308  0.659315  0.949093  0.872945  0.383024
2  0.976728  0.419274  0.993282  0.668539  0.970228
3  0.322936  0.555642  0.862659  0.134570  0.675897
4  0.167638  0.578831  0.141339  0.232592  0.976057
Run Code Online (Sandbox Code Playgroud)

Reindex 给了我正确的输出,但我需要将它分配回原始对象,这是我想通过使用来避免的copy=False

df.reindex( columns=['e', 'd', 'c', 'b', 'a'], copy=False )
Run Code Online (Sandbox Code Playgroud)

该行之后所需的输出是:

          e         d         c         b         a
0  0.177639  0.983243  0.664617  0.011235  0.234296
1  0.383024  0.872945  0.949093  0.659315  0.378308
2  0.970228  0.668539  0.993282  0.419274  0.976728
3  0.675897  0.134570  0.862659  0.555642  0.322936
4  0.976057  0.232592  0.141339  0.578831  0.167638
Run Code Online (Sandbox Code Playgroud)

为什么copy=False工作不到位?

有可能做到这一点吗?


使用 python 3.5.3,pandas 0.23.3

cs9*_*s95 11

reindex是一种结构性变化,而不是装饰性或变革性的变化。因此,总是会返回一个副本,因为该操作无法就地完成(它需要为底层数组分配新内存等)。这意味着您必须将结果分配回来,别无选择。

df = df.reindex(['e', 'd', 'c', 'b', 'a'], axis=1)  
Run Code Online (Sandbox Code Playgroud)

另请参阅有关GH21598的讨论。


copy=False真正有用的一种极端情况是用于重新索引的索引df与其已有的索引相同。您可以通过比较 id 来检查:

id(df)
# 4839372504

id(df.reindex(df.index, copy=False)) # same object returned 
# 4839372504

id(df.reindex(df.index, copy=True))  # new object created - ids are different
# 4839371608  
Run Code Online (Sandbox Code Playgroud)

  • 确实很有趣。并且误导,如果我可以说。无论如何,谢谢,而且,如果您碰巧学到新东西,我很高兴听到它:) (2认同)