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

时间:2019-06-05 14:02:07

标签: python pandas dataframe reindex

来自reindex docs

  

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

因此,我认为可以通过在位置(!)上设置Dataframe 来重新排序copy=False。但是,似乎确实得到了副本,需要再次将其分配给原始对象。如果可以避免的话,我不想将其分配回来(the reason comes from this other question)。

这就是我在做什么:

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()

出局:

          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

Reindex为我提供了正确的输出,但是我需要将其分配回原始对象,这是我想通过使用copy=False来避免的事情:

df.reindex( columns=['e', 'd', 'c', 'b', 'a'], copy=False )

该行之后的期望输出是:

          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

为什么copy=False无法正常运行?

有可能做到这一点吗?


使用python 3.5.3,pandas 0.23.3

2 个答案:

答案 0 :(得分:3)

reindex是一种结构性变化,而不是修饰性或变革性变化。这样,总是返回一个副本,因为该操作无法就地完成(这将需要为基础数组等分配新的内存)。这意味着您必须将结果分配回去,没有其他选择。

df = df.reindex(['e', 'd', 'c', 'b', 'a'], axis=1)  

另请参阅关于while... end的讨论。


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  

答案 1 :(得分:0)

有点题外话,但是我相信这会重新安排列的位置

    for i, colname in enumerate(list_of_columns_in_desired_order):
        col = dataset.pop(colname)
        dataset.insert(i, colname, col)