处理DataFrame列NaN值时遇TypeError,求跳过NaN行的优化方案
解决方法
报错原因是np.nan属于float类型,而字符串的replace()方法要求第一个参数必须是字符串类型,碰到NaN就会触发类型错误。要跳过含NaN的行,只对substring非空的行执行替换,有几种优雅的实现方式:
1. 修改列表推导式,增加非空判断
直接在原列表推导式里加条件,判断substring不为NaN时才执行替换:
import pandas as pd import numpy as np df = pd.DataFrame({ "string": ["foo", "moo", "too"], "substring": ["oo", "m", np.nan] }) df['string'] = [a.replace(b, '') if pd.notna(b) else a for a, b in zip(df['string'], df['substring'])]
2. 使用pandas的apply方法(按行处理)
用apply遍历每一行,结合条件判断实现需求:
df['string'] = df.apply(lambda row: row['string'].replace(row['substring'], '') if pd.notna(row['substring']) else row['string'], axis=1)
3. 向量化操作(适合大数据量)
利用pandas的掩码(mask)和str.replace实现向量化处理,效率更高:
mask = df['substring'].notna() # 仅对substring非空的行执行替换,注意regex=False避免将substring当作正则表达式解析 df.loc[mask, 'string'] = df.loc[mask, 'string'].str.replace(df.loc[mask, 'substring'], '', regex=False)
如果数据量较小,前两种方法足够简洁;如果处理大规模数据集,第三种向量化操作的性能优势更明显。
内容的提问来源于stack exchange,提问作者Nana
相关产品推荐
相关产品推荐

