首页  >  文章  >  后端开发  >  如何根据查询修改 Pandas 数据框而不出现意外行为?

如何根据查询修改 Pandas 数据框而不出现意外行为?

Susan Sarandon
Susan Sarandon原创
2024-11-03 17:25:02368浏览

How Can I Modify Pandas Dataframes Based on Queries Without Unexpected Behavior?

了解 Pandas 视图与复制规则

问题陈述

Pandas,一种流行的 Python 数据操作库,提供了一系列选择和修改数据帧的方法。但是,确定选择何时创建原始数据帧的副本或其视图可能会令人困惑。这种歧义会导致在尝试修改数据时出现意外行为。

简单规则

为了解决这种混乱,这里有一些管理 Pandas 的查看与复制行为的简单规则:

  • 所有操作通常都会生成一个副本。
  • 如果指定 inplace=True 参数,则就地进行修改,但只有某些操作支持此功能。
  • 用于设置的索引器(例如.loc、.iloc、.iat、.at)就地设置值。
  • 用于获取单一数据类型对象的索引器通常返回一个视图。然而,由于内存布局的考虑,这种行为并不完全可靠。
  • 用于获取多数据类型对象的索引器总是创建一个副本。

将规则应用于特定情况

让我们检查一下您提到的复杂情况:

df[df.C <= df.B] = 7654321

在这种情况下,适用索引器设置的规则。由于条件涉及两列的比较,Pandas 创建数据帧的中间副本来评估条件。然后就地修改该副本。因此,该表达式成功更改了原始数据帧中的值。

但是,链式索引表达式:

df[df.C <= df.B].ix[:, 'B':'E']

违反了规则。链接两个索引器会创建单独的 Python 操作,使 Pandas 难以可靠地拦截。这可能会导致意外行为,因此强烈建议不要这样做。

使用查询修改数据帧

要根据查询修改数据帧值,请使用以下方法:

df.loc[df.C <= df.B, 'B':'E'] = 7654321

此表达式使用单个索引器来评估查询条件并指定要修改的列子集。它比链式索引方法更快、更可靠。

以上是如何根据查询修改 Pandas 数据框而不出现意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn