gpt4 book ai didi

python - 为什么 pandas reindex() 不就地运行?

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:27 25 4
gpt4 key购买 nike

来自reindex docs :

Conform DataFrame to new index with optional filling logic, placing NA/NaN in locations having no value in the previous index. A new object is produced unless the new index is equivalent to the current one and copy=False.

因此,我认为我可以通过设置 copy=False 就地 (!) 来获得重新排序的 Dataframe。然而,我似乎确实得到了一份副本,需要再次将其分配给原始对象。如果可以避免的话,我不想将其重新分配 ( 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

最佳答案

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

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

另见关于 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

关于python - 为什么 pandas reindex() 不就地运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com