【问题标题】:How to replace Nan and negative number with zero如何用零替换Nan和负数
【发布时间】:2021-10-25 23:15:56
【问题描述】:

在上面的数据框中,我尝试使用 pandas 将最后一列中的 NaN 和负值替换为 0,我在这里使用了一些建议,但它似乎也会影响其他列并将其他列中的值替换为零。

如何将其限制为仅选定的列

【问题讨论】:

  • df.new_expenses = df.new_expenses.clip(lower=0).fillna(0) ??
  • 数据帧的图像没有用。最好提供一些创建示例数据框的代码。
  • 不确定Community 标记重复是什么意思,但我不认为the linked duplicate 是正确的。 OP 的问题是只是fillna。也许它仍然是某个地方另一个问题的副本,但不是当前链接的副本。
  • 我同意你的观点,我重新打开了这个问题@tdy。如果 OP 接受建议的重复并自行关闭问题,社区可以标​​记重复。 Why does this question show as “marked as duplicate by Community♦”?

标签: python pandas dataframe


【解决方案1】:

使用clip 将负值设置为最小值,使用fillna 替换NA:

df['New_expenses'] = df['New_expenses'].clip(lower=0).fillna(0)

【讨论】:

  • 我认为df[['New_expenses', 'Month_Expenses']] = df[['New_expenses', 'Month_Expenses']].clip(lower=0).fillna(0) 可以定位多个列。
  • 正确,但据我了解,只有最后一列是目标。但现在 OP 有了选择 ;)
【解决方案2】:

您可以使用.mask() 一次性将负数更改为NaN,然后将fillna() 更改为0 以及其他NaN 值,如下所示:

df['New_expenses'] = df['New_expenses'].mask(df['New_expenses'] < 0).fillna(0)

或者,更简单,归功于@tdy,改用.where()

df['New_expenses'] = df['New_expenses'].where(df['New_expenses'] >= 0, 0)

.where() 在条件为真时保留值,在条件为假时替换值。

在这种情况下,我们会在值为正时保留这些值,并在条件为假时将值替换为0(包括负数和NaN 值)。

【讨论】:

  • @tdy 对,那就更好了。感谢您的非常好的建议:-)
  • @tdy 感谢您的编辑。我特意改成&gt;=,以避免看似多余的将0替换为0的动作。无论如何,感谢编辑。
  • 啊抱歉,我弄混了!你说得对,&gt;= 避免了冗余,而不是&gt;
  • @tdy 是的,很容易混淆。我经常有这个:-D
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2012-07-01
  • 2015-03-02
  • 2013-08-11
  • 2012-10-29
相关资源
最近更新 更多