Python新手求助:如何删除CSV文件中包含字符串的行?
清理CSV训练数据:移除含错误字符串的行
问题场景
作为Python编程新手,我正在写脚本清理用于训练的CSV文件。已经用df.dropna()成功移除了空值,但文件里存在像0,0.0,0.0,0.0,zero,0.0,0.0这种带错误字符串的行,想删除包含这类字符串的整行。
我试了下面的循环代码,但没效果:
Totalrows = len(df.index) TotalColumns = df.shape[1] CurrentColumn = 0 while CurrentColumn < TotalColumns: CurrentRow = 1 while CurrentRow < Totalrows: if df.loc[CurrentRow, CurrentColumn] == str: df.drop(CurrentRow, axis=0, inplace=True) CurrentRow + 1 CurrentColumn + 1
另外常见的日期转换方案(比如df['Date'] = pd.to_datetime(df['Date']))不适用我的场景,该怎么解决?
问题分析
你写的循环有两个关键问题:
CurrentRow + 1和CurrentColumn + 1只是做了计算,没有赋值给变量,循环永远不会推进,会直接陷入死循环- 判断条件
df.loc[CurrentRow, CurrentColumn] == str完全错误——str是Python的类型对象,你应该判断单元格的值类型是不是字符串,或者能不能被转换成数值
解决方案
用pandas的内置方法比手动写循环高效得多,分两种场景处理:
场景1:所有列都应该是数值型
如果你的CSV所有列都应该是数值(比如训练数据的特征列),直接把整个表转成数值,无法转换的内容会变成NaN,再删掉含NaN的行即可:
# 把所有列转为数值,无法转换的设为NaN df = df.apply(pd.to_numeric, errors='coerce') # 删除包含NaN的行(即原来有错误字符串的行) df = df.dropna()
场景2:只有特定列不能有字符串
如果只是部分列需要检查(比如某几列特征必须是数值),指定列单独处理即可:
# 替换成你需要检查的列名 target_columns = ['feature1', 'feature3', 'feature5'] # 遍历指定列,转为数值,无法转换的设为NaN for col in target_columns: df[col] = pd.to_numeric(df[col], errors='coerce') # 只删除指定列中含NaN的行 df = df.dropna(subset=target_columns)
方法说明
pd.to_numeric的errors='coerce'参数会自动把非数值的字符串(比如zero)转换成NaN,之后用dropna就能精准删掉那些包含错误字符串的行,完全不用手动遍历每一行每一列,既简洁又高效。
内容的提问来源于stack exchange,提问作者Zany
相关产品推荐
相关产品推荐

