我有一个非常大的数据框(千 x 千),这里只显示 5 x 3,时间就是索引
col1 col2 col3
time
05/04/2018 05:14:52 AM +unend +unend 0
05/04/2018 05:14:57 AM 0 0 0
05/04/2018 05:15:02 AM 30.691 0.000 0.121
05/04/2018 05:15:07 AM 30.691 n. def. 0.108
05/04/2018 05:15:12 AM 30.715 0.000 0.105
由于这些来自其他设备(df 由 pd.read_csv(filename) 生成),数据帧不再是完全的 float 类型,现在最终具有不需要的字符串,如 +unend 和 n。定义。。这些不是经典的 +infinity 或 NaN , df.fillna() 可以解决。我想用 0.0 替换字符串。我看到了这些答案 Pandas replace type issue和 replace string in pandas dataframe尽管尝试做同样的事情,但它们是按列或按行的,而不是按元素的。但是,在评论中也有一些关于处理一般情况的良好提示。
如果我尝试做
mask = df.apply(lambda x: x.str.contains(r'+unend|n. def.'))
df[mask] =0.0
我收到错误:没有什么可重复的
如果我愿意
mask = df.apply(lambda x: (str('n. def.') in (str(x)) or (str('unend') in str(x))) )
df[mask]=0.0
我会得到一个 Series 对象,每列都带有 True 或 False,而不是元素掩码,因此会出现错误 TypeError:无法对具有非 np.nan 值的混合类型执行就地 bool 值设置。
下面
mask = df.applymap(lambda x: (str('n. def.') in (str(x)) or (str('unend') in str(x))) )
df[mask.values]=0.0
确实给我预期的结果用 0.0 替换所有不需要的字符串但是,它很慢(unpythonic?)而且,我不确定我是否可以使用正则表达式而不是 in 进行检查,特别是,如果我知道有混合数据类型。有没有一种高效、快速、健壮但又基本通用的方法来做到这一点?
请您参考如下方法:
These are not the classical +infinity or NaN , that df.fillna() could take care off
您可以指定一个字符串列表,以便在读取 csv 文件时将其视为 NA。
df = pd.read_csv(filename, na_values=['+unend', 'n. def.'])
然后用fillna填充NA值
