【问题标题】:Replacing values in multiple specific columns of a Dataframe替换数据框的多个特定列中的值
【发布时间】:2018-07-19 14:16:06
【问题描述】:

我有以下数据框:

import pandas as pd
import numpy as np

raw_data = {
    'Score1': [42, 52, -999, 24, 73], 
    'Score2': [-999, -999, -999, 2, 1],
    'Score3': [2, 2, -999, 2, -999]}
df = pd.DataFrame(raw_data, columns = ['Score1', 'Score2', 'Score3'])

并且我想仅在 Score2 和 Score3 列中将 -999 替换为 NaN,而使 Score1 列保持不变。我想通过名称引用要修改的列,它们可能不连续。

我尝试过类似的方法:

df.loc[:,('Score2', 'Score3')].replace(-999, np.nan, inplace=True)
df

但这不起作用,我认为是因为它正在对副本进行操作。有没有办法在一个语句中做到这一点?

我查看了Pandas replacing values on specific columns,但发现它很混乱,所以觉得一个更简单的例子会有所帮助。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您不能使用inplace=True,因为子集返回一个可能将其数据作为视图的系列。就地修改它并不总是将它传播回父对象。这就是为什么SettingWithCopyWarning 可能在那里(或者如果你设置了选项,则提高)。你不应该这样做,他们也不是这样做的理由。

df[['Score2', 'Score3']] = df[['Score2', 'Score3']].replace(-999, np.nan)
print (df)
   Score1  Score2  Score3
0      42     NaN     2.0
1      52     NaN     2.0
2    -999     NaN     NaN
3      24     2.0     2.0
4      73     1.0     NaN

【讨论】:

  • 谢谢。两种解决方案都有效,但我接受这个答案,因为它对我来说更直观,不需要'inplace=True'。
【解决方案2】:

使用

In [282]: df.replace({'Score2': -999, 'Score3': -999}, np.nan)
Out[282]:
   Score1  Score2  Score3
0      42     NaN     2.0
1      52     NaN     2.0
2    -999     NaN     NaN
3      24     2.0     2.0
4      73     1.0     NaN

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2021-11-24
    • 2015-12-23
    • 2020-10-23
    • 2019-02-25
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多