Skip to main content
 首页 » 编程设计

python之明智有效地替换 pandas 数据框中不需要的字符串

2025年05月04日25txw1958

我有一个非常大的数据框(千 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值