【问题标题】:np.nan if contains character pythonnp.nan if 包含字符 python
【发布时间】:2016-12-23 00:40:16
【问题描述】:

df1

Pet                            
Dog-Ralph                     
Cat                                  
2016-11-03 00:00:00 

我有上面的数据框,我想将 '2016-11-03 00:00:00' 值转换为 NaN 值。由于它是唯一包含冒号的值,我如何将该值转换为 NaN,如下所示:

Pet                            
Dog-Ralph                     
Cat                                  
NaN

感谢您的帮助!

【问题讨论】:

  • 它应该转换为NaN,因为它包含一个冒号?是否只有一个值需要更改或所有包含冒号的值都应更改为 NaN?
  • “宠物”列中的任何值。我的数据集中可能有多个具有此属性。

标签: python


【解决方案1】:
import pandas as pd
import numpy as np

data = [{'name': 'Pet'},{'name':'Dog-Ralph'},{'name':'Cat'},{'name':'2016-11-03 00:00:00'}]

df = pd.DataFrame.from_dict(data, orient='columns')

df

输出:

    name
0   Pet
1   Dog-Ralph
2   Cat
3   2016-11-03 00:00:00

使用 np.where 查找和替换更快:Read more

df['name'] = np.where(df['name'].str.contains(":"), np.nan, df['name'])

df

输出:

    name
0   Pet
1   Dog-Ralph
2   Cat
3   NaN

查看 np.where 性能详情:Why is np.where faster than pd.apply

【讨论】:

    【解决方案2】:

    你可以试试这个:

    df
    
    #   Pet
    #0  Dog-Ralph
    #1  Cat
    #2  2016-11-03 00:00:00
    
    import numpy as np
    df[df["Pet"].notnull() & df['Pet'].str.contains(":")] = np.nan
    # replace any non-nan string with `colon` with np.nan    
    
    df
    #   Pet
    #0  Dog-Ralph
    #1  Cat
    #2  NaN
    

    或者如果您只需要替换Pet 列:

    df.loc[df["Pet"].notnull() & df["Pet"].str.contains(":"), "Pet"] = np.nan
    

    【讨论】:

    • 运行此程序时出现以下错误:ValueError: cannot index with vector contains NA / NaN values
    • 查看更新后的版本,很可能您的列中已经有一些缺失值,使用notnull()将它们转换为False
    • 有趣,它适用于我的虚拟示例,也许,您的数据包含一些我无法想到的特殊情况。
    猜你喜欢
    • 2015-03-19
    • 2017-12-02
    • 2021-06-12
    • 2018-02-10
    • 2021-06-08
    • 2021-09-03
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多