首页  >  文章  >  后端开发  >  错误使用链式赋值如何导致 Pandas 出现意外结果?

错误使用链式赋值如何导致 Pandas 出现意外结果?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-24 06:15:30463浏览

How Can Incorrect Use of Chained Assignments Lead to Unexpected Results in Pandas?

Pandas 中的链式赋值

在 Pandas 中使用数据帧时,链式赋值可能会导致意外行为或误报,如设置WithCopyWarning。此警告旨在提醒用户链式赋值的潜在陷阱。

链式赋值如何工作

在 Pandas 中,大多数方法调用都会返回对象的副本。这意味着当您执行链式分配时,例如 df['column'] = df['column'].fillna(...),您可能正在修改原始数据帧的副本而不是原始数据帧本身。

使用 .ix()、.iloc() 和 .loc() 进行链接的效果

ix()、iloc() 和 loc 的选择() 会影响链式赋值行为:

  • ix() 已弃用,不应使用。
  • iloc() 使用整数索引检索数据。该方法只能直接访问元素,不支持链式赋值。
  • loc() 使用标签检索数据。使用 loc() 的链式赋值创建一个新对象,该对象可能会也可能不会修改原始数据帧。

最佳编码实践

避免潜在问题链式赋值,建议将操作结果显式分配给新变量。例如,不要使用:

<code class="python">df['amount'] = df['amount'].fillna(...)</code>

使用:

<code class="python">df['amount_updated'] = df['amount'].fillna(...)</code>

误报

某些链式分配即使在执行时也可能会触发警告不修改原始数据框。在这种情况下,您可以使用以下方法关闭警告:

<code class="python">pd.set_option('chained_assignment', None)</code>

示例

考虑以下代码:

<code class="python">data['amount'] = data.apply(lambda row: function1(row, date, qty), axis=1) 
data['amount'] = data['amount'].astype(float)</code>

此代码可能会引发SettingWithCopyWarning,因为data['amount'] 被分配了两次。要解决此问题,请将第一个操作的结果分配给新变量:

<code class="python">temp_amount = data.apply(lambda row: function1(row, date, qty), axis=1) 
data['amount'] = temp_amount.astype(float)</code>

以上是错误使用链式赋值如何导致 Pandas 出现意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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