基于条件用NaN替换数据帧值同时保持d的形状

2024-09-28 21:59:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手。我肯定我问的是一个无关紧要的问题,但在做了一点googlefoo之后,不幸的是我还没有找到解决办法。所以就这样: 如果我有这样的数据帧:

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和postestscore?你知道吗

我可以使用测向替换(-999, np.nan公司)但这需要跨两列有条件地删除。你知道吗

谢谢你的好意


Tags: 数据nameagedatarawmollyfirstlast
2条回答

^{}

直列

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'

  • preTestScore-999时,df[cols].mask(df[cols[0]].eq(-999))将使两列np.nan

  • 我使用assign生成包含新列的数据帧,而不覆盖旧的数据帧。如果要持久化此新数据帧,请将结果指定给一个名称。您甚至可以使用旧名称df = df.assign(**df[cols].mask(df[cols[0]].eq(-999)))

  • assign获取关键字参数,您可以通过使用双splat **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

^{}与boolen mask一起使用,并将列列表设置为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

相关问题 更多 >