理解 pandas 中的 inplace=True

新手上路,请多包涵

pandas 库中很多时候有一个选项可以更改对象,例如使用以下语句……

 df.dropna(axis='index', how='all', inplace=True)

我很好奇当 inplace=True inplace=False 时返回什么以及如何处理对象。

所有操作都在修改 selfinplace=True 吗?当 inplace=False 是立即创建的新对象,例如 new_df = self 然后 new_df 被返回?


如果您试图关闭某人应该使用 inplace=True 而没有使用的问题,请考虑 replace() 方法不适用于 Pandas DataFrame

原文由 Aran Freel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 819
2 个回答

inplace=True 被传递时,数据被原地重命名(它不返回任何内容),所以你可以使用:

 df.an_operation(inplace=True)

当传递 inplace=False 时(这是默认值,因此不是必需的),执行操作并返回对象的副本,因此您可以使用:

 df = df.an_operation(inplace=False)

原文由 Ed Harrod 发布,翻译遵循 CC BY-SA 4.0 许可协议

在熊猫中,inplace = True 是否被认为是有害的?

TLDR;是的,是的。

  • inplace ,与名称所暗示的相反,通常不会阻止创建副本,并且(几乎)从不提供任何性能优势
  • inplace 不适用于方法链
  • inplace 可以导致 SettingWithCopyWarning 如果在 DataFrame 列上使用,并且可能会阻止操作进行,导致代码中难以调试的错误

以上痛点是新手常犯的坑,去掉这个选项会简化API。


我不建议设置这个参数,因为它没有什么用处。请参阅 此 GitHub 问题,该问题提出 inplace 参数在 api 范围内弃用。

一个常见的误解是使用 inplace=True 将导致更高效或优化的代码。实际上,使用 inplace=True 绝对没有性能优势。 _无论如何_,就地和不就地版本都会创建数据副本,就地版本会自动分配回副本。

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

使用 inplace=True 在 DataFrame 列上调用函数 可能有效,也可能无效。当涉及链式索引时尤其如此。

好像上面描述的问题还不够, inplace=True阻碍了方法链接。对比一下的工作

result = df.some_function1().reset_index().some_function2()

相对于

temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()

前者有助于更好的代码组织和可读性。


另一个支持性声明是 set_axis 的 API 最近已更改,使得 inplace 默认值从 True 切换为 False。请参见 GH27600 。干得好开发者!

原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题