【问题标题】:Creating new column based on other column values with condition基于具有条件的其他列值创建新列
【发布时间】:2021-04-27 23:43:16
【问题描述】:

我有一列包含值:

brand
Brand1
Brand2
Brand3
data.brand = data.brand.astype(str)
data.brand = data.brand.replace(r'^\s*$', np.nan, regex=True)
data['branded'] = np.where(data['brand']!= 'nan', True, False)

在第一次初始化代码后,我得到了结果:

brand branded
Brand1 TRUE
Brand2 TRUE
nan TRUE
Brand3 TRUE

在第二次初始化相同的代码后,我得到了想要的结果:

brand branded
Brand1 TRUE
Brand2 TRUE
nan FALSE
Brand3 TRUE

面对/避免这个问题的更聪明的方法是什么?

【问题讨论】:

  • data.brand = data.brand.replace(r'^\s*$', 'nan', regex=True)替换这个data.brand = data.brand.replace(r'^\s*$', np.nan, regex=True)
  • 您也可以避免使用replacenp.where 部分,因为您只是检查brand 中的值是否存在完整的空白字符,这可以使用str,contains 轻松实现。请查看data['branded'] = data['brand'].str.contains(r'^\s*$')
  • 谢谢! data.brand = data.brand.replace(r'^\s*$', 'nan', regex=True) 修复它!
  • data['brand'] = data['brand'].str.contains(r'^\s*$') 这与想要的结果相反
  • @A99 只需反转掩码检查data['branded'] = ~data['brand'].str.contains(r'^\s*$')

标签: python pandas dataframe numpy


【解决方案1】:

这个答案只关注为什么第一次迭代不起作用

在您的代码中,当您将data.brand 替换为regex 时,您将替换为不是nannp.nan,因此第一个init 无法识别下一行中的条件:np.where(data['brand']!= 'nan', True, False)。但是,在第二次初始化时,该行已经是 np.nan,而您在第一行执行 .astype(str),将 np.nan 设置为 'nan',因此第三行有效。

解决方案:

替换:

data.brand = data.brand.replace(r'^\s*$', np.nan, regex=True)

与:

data.brand = data.brand.replace(r'^\s*$', 'nan', regex=True)

这将从一开始就将替换值设置为'nan',因此第三行将在第一次迭代中运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2020-04-11
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多