【问题标题】:Pandas replace values in dataframe conditionally based on string comparePandas 根据字符串比较有条件地替换数据框中的值
【发布时间】:2018-12-17 17:04:32
【问题描述】:

我有一个带有 3 列的 pandas 数据框,如下所示。我想比较每一列以查看该值是否与特定字符串匹配,如果是,则将该值替换为 NaN。

例如,如果数据框的第 1 列有 5 个值:

abcd
abcd
defg
abcd
defg

如果比较字符串是defg,那么数据框中第1列的最终结果应该是。

abcd
abcd
NaN
abcd
NaN

【问题讨论】:

  • @ pseudocode425,如果任何解决方案对您有效并且最适合您,请接受它作为答案!

标签: python string pandas


【解决方案1】:

使用 pandas 内置解决方案 使用 replace 方法作为正则表达式和 inplace 方法使其永久存在于数据框中,同时使用 numpy 将匹配值替换为 NaN

import pandas as pd
import numpy as np

示例数据框:

df
   col1
0  abcd
1  abcd
2  defg
3  abcd
4  defg

结果:

df['col1'].replace(['defg'], np.nan, regex=True, inplace=True)
   df
       col1
    0  abcd
    1  abcd
    2   NaN
    3  abcd
    4   NaN

【讨论】:

    【解决方案2】:

    您可以使用numpy where 根据布尔条件设置值:

    import numpy as np
    df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df["col_name"])
    

    显然将col_name 替换为您的实际列名。

    另一种方法是使用 pandas .loc 来更改 DataFrame 中的值:

    df.loc[df["col_name"]=="defg", "col_name"] = np.nan
    

    【讨论】:

    • 我得到一个 TypeError: invalid type comparison with this,它是在比较 Series 和 Str?
    【解决方案3】:

    你可以使用mask,这会将整个数据帧中的'defg'替换为NaN:

    df.mask(df == 'defg')
    

    输出:

          0
    0  abcd
    1  abcd
    2   NaN
    3  abcd
    4   NaN
    

    您也可以对列执行此操作:

    df['col1'].mask(df['col1'] == 'defg')
    

    或者在他的解决方案中使用 @pygo 建议的替换

    df['col1'].replace('defg',np.nan)
    

    【讨论】:

    • @Scott Boston - 如果我只想在特定列而不是整个数据集中进行替换,这将如何工作?
    • @pseudocode425,尝试我提供的替代答案,我已经说明以创建列col1 为例。
    • 但是对于 Scott 的回答,只需尝试像 df.col1.mask(df == 'defg') 这样就可以满足您的要求。
    【解决方案4】:

    有很多解决方案...如果您想练习使用 lambda 函数,您总是可以这样做...

    df['Col1'] = df.Col1.apply(lambda x: np.nan if x == 'defg' else x)
    

    结果:

    0  abcd
    1  abcd
    2   NaN
    3  abcd
    4   NaN
    Seconds:  0.0020899999999999253
    

    虽然经过一些单元测试,但处理时间可能比上述解决方案慢一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2018-09-26
      相关资源
      最近更新 更多