[英]Why doesn't pandas reindex() operate in-place?
从重新索引文档:
使用可选的填充逻辑使 DataFrame 符合新索引,将 NA/NaN 放置在前一个索引中没有值的位置。 除非新索引与当前索引等效并且 copy=False,否则将生成一个新对象。
因此,我认为我会通过将copy=False
设置到位 (!)来获得重新排序的数据Dataframe
。 但是,看来我确实得到了一个副本,并且需要再次将其分配给原始对象。 如果我可以避免它,我不想将它分配回来(原因来自另一个问题)。
这就是我正在做的:
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
有点离题,但我相信这会重新排列列
for i, colname in enumerate(list_of_columns_in_desired_order):
col = dataset.pop(colname)
dataset.insert(i, colname, col)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.