我有以下数据框:
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列中用NaN替换-999,而保留Score1列不变。我想引用要按名称修改的列,它们可能不是连续的。
我尝试过类似的事情:
df.loc[:,('Score2', 'Score3')].replace(-999, np.nan, inplace=True)
df
但是这不起作用,我认为是因为它在副本上运行。有没有一种方法可以做到这一点?
我看着Pandas replacing values on specific columns,但发现它很混乱,所以觉得一个简单的例子会有所帮助。
答案 0 :(得分:4)
您不能使用inplace=True
,因为子集返回一个Series,该Series的数据可能作为视图。在原位修改它不会始终将其传播回父对象。这就是为什么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
答案 1 :(得分:4)
使用
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