一次更改pandas DataFrame的多个列中的某些值

dbl*_*iss 25 python pandas

假设我有以下DataFrame:

In [1]: df
Out[1]:
  apple banana cherry
0     0      3   good
1     1      4    bad
2     2      5   good
Run Code Online (Sandbox Code Playgroud)

这按预期工作:

In [2]: df['apple'][df.cherry == 'bad'] = np.nan
In [3]: df
Out[3]:
  apple banana cherry
0     0      3   good
1   NaN      4    bad
2     2      5   good
Run Code Online (Sandbox Code Playgroud)

但这不是:

In [2]: df[['apple', 'banana']][df.cherry == 'bad'] = np.nan
In [3]: df
Out[3]:
  apple banana cherry
0     0      3   good
1     1      4    bad
2     2      5   good
Run Code Online (Sandbox Code Playgroud)

为什么?如何在不必写出两行的情况下实现'apple'和'banana'值的转换,如

In [2]: df['apple'][df.cherry == 'bad'] = np.nan
In [3]: df['banana'][df.cherry == 'bad'] = np.nan
Run Code Online (Sandbox Code Playgroud)

And*_*den 33

您应该使用loc并执行此操作而不进行链接:

In [11]: df.loc[df.cherry == 'bad', ['apple', 'banana']] = np.nan

In [12]: df
Out[12]: 
   apple  banana cherry
0      0       3   good
1    NaN     NaN    bad
2      2       5   good
Run Code Online (Sandbox Code Playgroud)

请参阅有关返回视图与副本的文档,如果您将链接分配到副本(并丢弃),但如果您在一个位置执行此操作,则pandas会巧妙地意识到您要分配给原始文件.


Rom*_*kar 5

这是因为df[['apple', 'banana']][df.cherry == 'bad'] = np.nan分配给 DataFrame 的副本。尝试这个:

df.ix[df.cherry == 'bad', ['apple', 'banana']] = np.nan
Run Code Online (Sandbox Code Playgroud)

  • 不要再使用 api `ix`,改用 `loc` 或 `iloc`,请参阅[What ismeaning by ".ix is deprecated" in Python Pandas?](https://www.quora.com/What -在 Python-Pandas 中是 ix 的意思是已弃用) (3认同)