【问题标题】:python pandas: how to avoid chained assignmentpython pandas:如何避免链式赋值
【发布时间】:2015-11-28 04:58:14
【问题描述】:

我有一个带有两列的 pandas 数据框:x 和 value。 我想找到 x == 10 的所有行,并且为所有这些行设置 value = 1,000。我尝试了下面的代码,但收到警告

A value is trying to be set on a copy of a slice from a DataFrame.

我知道我可以通过使用 .loc 或 .ix 来避免这种情况,但我首先需要找到满足我的 x ==10 条件的所有行的位置或索引。有没有更直接的方法?

谢谢!

import numpy as np
import pandas as pd

df=pd.DataFrame()
df['x']=np.arange(10,14)
df['value']=np.arange(200,204)


print df

df[ df['x']== 10 ]['value'] = 1000 # this doesn't work

print df

【问题讨论】:

  • 抱歉使用推荐的df.loc[df['x'] == 10, 'value'] = 1000有什么问题?
  • 谢谢,我没有意识到这是一个选项。也许只是我,也许是因为我太习惯SQL,对Pandas太陌生,但我还是发现SQL中一些平庸的任务在pandas中是乱七八糟的,文档也不是很清楚
  • docs 非常清楚,警告是告诉你你正在做的事情可能不起作用
  • 我觉得他们一点都不清楚。 pandas 文档与 Matlab 等商业产品的文档没有可比性。例如。如果您查找 Pandas.DataFrame.loc 的文档,语法的解释非常简短。它指向按标签选择,但即使在那里我也找不到像你上面发布的那样的例子。有一个“与 sql 比较”部分,但也没有您的示例,并且“更新”子部分为空。
  • PS,如果您将其作为答案发布,我会接受它

标签: python pandas


【解决方案1】:

您应该使用loc 来确保您正在处理视图,在您的示例中,以下内容将起作用并且不会引发警告:

df.loc[df['x'] == 10, 'value'] = 1000

所以一般形式是:

df.loc[<mask or index label values>, <optional column>] = < new scalar value or array like>

docs 突出显示错误,还有intro,授予某些功能文档稀疏,请随时提交改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2012-12-12
    • 2017-04-25
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多