根据条件用NaN替换数据帧值,同时保留df的形状

时间:2018-10-19 12:38:45

标签: python pandas

此处是Python新手。我确定我在问一个琐碎的问题,但是不幸的是,在做完google-foo之后,我还没有找到解决方案。所以就这样: 如果我有这样的数据框:

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
    'age': [42, 52, 36, 24, 73], 
    'preTestScore': [-999, -999, -999, 2, 1],
    'postTestScore': [2, 2, -999, 2, -999]}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'preTestScore', 'postTestScore'])

如何执行以下操作: 如果preTestScore = -999,那么用NaN替换preTestScore和postTestScore?

我可以使用df.replace(-999,np.nan)将NaN替换为单个列值,但这需要在两列之间有条件地删除。

谢谢你

2 个答案:

答案 0 :(得分:3)

loc与布尔值掩码和要设置为NaN的列列表一起使用:

df.loc[df['preTestScore'] == -999, ['preTestScore','postTestScore']] = np.nan
print (df)

      first_name last_name  age  preTestScore  postTestScore
0      Jason    Miller   42           NaN            NaN
1      Molly  Jacobson   52           NaN            NaN
2       Tina       Ali   36           NaN            NaN
3       Jake    Milner   24           2.0            2.0
4        Amy     Cooze   73           1.0         -999.0

详细信息

print (df['preTestScore'] == -999)
0     True
1     True
2     True
3    False
4    False
Name: preTestScore, dtype: bool

答案 1 :(得分:2)

pandas.DataFrame.mask

在线

cols = ['preTestScore', 'postTestScore']
df.assign(**df[cols].mask(df[cols[0]].eq(-999)))

  first_name last_name  age  preTestScore  postTestScore
0      Jason    Miller   42           NaN            NaN
1      Molly  Jacobson   52           NaN            NaN
2       Tina       Ali   36           NaN            NaN
3       Jake    Milner   24           2.0            2.0
4        Amy     Cooze   73           1.0         -999.0

说明

  • 我使用cols来避免写长列名。 cols[0]是编写'preTestScore'

  • 的捷径 当df[cols].mask(df[cols[0]].eq(-999))np.nan时,
  • preTestScore将同时创建两列-999

  • 我使用assign来生成带有新列的数据框,而不会覆盖旧数据框。如果要保留此新数据框,请将结果分配给一个名称。您甚至可以使用旧名称df = df.assign(**df[cols].mask(df[cols[0]].eq(-999)))

  • assign带有关键字参数,您可以通过解压缩带有双斜线**kwargs的字典来传递这些参数。方便地,当在字典上下文中使用数据框时,它会按照我们想要的方式以列名作为关键字并以列作为值来解包。


就地

cols = ['preTestScore', 'postTestScore']
df[cols] = df[cols].mask(df[cols[0]].eq(-999))
df

  first_name last_name  age  preTestScore  postTestScore
0      Jason    Miller   42           NaN            NaN
1      Molly  Jacobson   52           NaN            NaN
2       Tina       Ali   36           NaN            NaN
3       Jake    Milner   24           2.0            2.0
4        Amy     Cooze   73           1.0         -999.0