之前已经讨论过,但是答案有冲突:
我想知道的是:
inplace = False
是默认行为? inplace = True
而失败/行为不当? inplace = True
操作是否会“真正”就地执行吗? 到目前为止,我的看法是:
inplace
参数,始终默认为False
,这意味着原始DataFrame未被修改,并且该操作返回一个新的DF。 inplace = True
时,操作可以在原始DF上使用,但仍可以在幕后使用副本,并且只需在完成后重新分配引用即可。 inplace = True
的优点:reset_index()
运行速度快两倍,并且使用峰值内存的一半!)。 inplace = False
的优点:df.dropna().rename().sum()...
很好,并提供了惰性评估或更有效的重新排序的机会(尽管我不认为Pandas会这样做)。 inplace = True
时,Pandas必须进行SettingWithCopy
检查,这很昂贵。 inplace = False
避免了这种情况。 因此,撇开copy-vs-view问题,似乎总是使用
inplace = True
更具性能,除非专门编写链式语句。但这不是 Pandas 默认的选择,那么我想念的是什么? 最佳答案
是的。不仅有害。非常有害。 This GitHub issue建议在不久的将来某个时间在api范围内弃用inplace
参数。简而言之,这是inplace
参数的所有错误:
inplace
与名称含义相反,通常不会阻止创建副本,并且(几乎)从不提供任何性能优势inplace
不适用于方法链接inplace
可能导致可怕的SettingWithCopyWarning
,有时可能无法就地更新上面的痛点都是初学者的常见陷阱,因此删除此选项将大大简化API。
我们将更深入地研究以上几点。
性能
一个常见的误解是,使用
inplace=True
将导致更高效或更优化的代码。通常,与inplace=True
相比没有性能优势。方法的大多数就地和就地版本都会创建数据的副本,而就地版本会自动将副本分配回去。无法避免复制。方法链接
inplace=True
也阻碍了方法链接。对比一下result = df.some_function1().reset_index().some_function2()
相对于temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()
意外陷阱最后要注意的一点是,调用
inplace=True
可以触发 SettingWithCopyWarning
:df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})
df2 = df[df['a'] > 1]
df2['b'].replace({'x': 'abc'}, inplace=True)
# SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame
这可能会导致意外行为。