【问题标题】:Python Pandas replace values if not in value range如果不在值范围内,Python Pandas 会替换值
【发布时间】:2020-10-21 13:46:16
【问题描述】:

如果每个值不在特定值范围内,我想替换一列的所有单元格。

例如取值范围在 0 到 10 之间

该函数应将 np.NaN 放在所有小于 0 或大于 10 的单元格上。

我试过这个:

df.loc[(df["B"] < 5 ), "B"] = np.NaN

但它只适用于特定值,而不适用于值范围。

是否有一个简单的解决方案来替换特定值范围之外的所有值,而不遍历所有行?

【问题讨论】:

  • df.B.between(0, 10)

标签: python pandas replace range


【解决方案1】:

我会在功能之间选择

df.loc[~df.B.between(0, 10), "B"] = np.nan

【讨论】:

  • 你想在你的条件前面添加~ 来否定它;)
【解决方案2】:

您可以使用 np.where 指定所需的条件。如果为 True,则产生 x,否则产生 y。

np.where(condition, x, y)

所以,解决办法是:

df.B = np.where((df.B < 0) & (df.B > 10), np.NaN, df.B)

例如:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))

会输出类似的东西:


    A   B   C   D
0   2   5   6   2
1   0   4   0   0
2   4   3   9   0
3   5   1   1   8
4   2   3   6   5
5   3   0   3   9
6   0   4   3   4
7   4   1   4   5
8   0   5   1   5
9   6   7   4   4

那么如果你应用 where 条件:

df.B = np.where((df.B < 6) & (df.B > 2), np.NaN, df.B)
    A   B   C   D
0   2   NaN 6   2
1   0   NaN 0   0
2   4   NaN 9   0
3   5   1.0 1   8
4   2   NaN 6   5
5   3   0.0 3   9
6   0   NaN 3   4
7   4   1.0 4   5
8   0   NaN 1   5
9   6   7.0 4   4

您可以在这里找到更多信息:https://numpy.org/doc/stable/reference/generated/numpy.where.html

【讨论】:

    【解决方案3】:

    更接近您的原始语法

    df.loc[(df["B"] < 0 )|(df["B"] > 10 ), "B"] = np.NaN
    

    【讨论】:

      【解决方案4】:

      是的,你可以这样做:

      
      df["B"] = df["B"].where((df["B"] >= 0) & (df["B"] <= 10))
      
      # or
      df["B"] = df["B"].map(lambda x: x if 0 <= x <= 10 else None)
      
      # or
      df.loc[(df["B"] < 0) | (df["B"] > 10), "B"] = None
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 2021-12-25
        相关资源
        最近更新 更多