如何在Dask DataFrame中删除列数不符合指定值的行?
解决CSV文件过滤列数不符行的Python实现方案
原代码问题分析
你之前写的Python代码无效,核心原因是逻辑错误:
df.count(axis=1)统计的是每行非缺失值的数量,不是实际字段总数。如果某行列数正确但存在空值,会被误判删除。df[len(df.index) == len(usecols)]逻辑完全错误,len(df.index)是总行数,和列数比较没有意义,只会导致全保留或全删除。
正确实现方案
以下两种方案匹配你AWK脚本的逻辑(过滤空行、保留列数为指定值的行):
方案1:逐行解析(贴近AWK逻辑,兼容复杂CSV格式)
用csv模块逐行读取解析,准确统计每行字段数,同时自动处理带引号的字段(比如字段内包含逗号的情况,AWK默认无法正确解析):
import csv import pandas as pd # 指定目标列数,对应你AWK里的13 target_col_count = 13 filtered_data = [] with open("你的文件.csv", "r", newline="", encoding="utf-8") as f: reader = csv.reader(f) # 读取表头并检查列数 header = next(reader) if len(header) != target_col_count: print("表头列数与目标不符,请检查文件") filtered_data.append(header) for row in reader: # 跳过空行 if not row: continue # 保留列数符合要求的行 if len(row) == target_col_count: filtered_data.append(row) # 转换为DataFrame df = pd.DataFrame(filtered_data[1:], columns=filtered_data[0])
方案2:Pandas快速处理(适合格式规范的CSV)
如果你的CSV没有复杂格式(无引号包裹的逗号),可以用Pandas的内置参数快速过滤:
import pandas as pd target_col_count = 13 # 读取时自动跳过字段数不匹配的行 df = pd.read_csv("你的文件.csv", on_bad_lines="skip") # 删除全空的行 df = df.dropna(how="all") # 额外校验:检查整体列数是否符合要求 if len(df.columns) != target_col_count: print(f"当前数据列数为{len(df.columns)},不符合目标{target_col_count}列")
适配usecols的情况
如果你的代码中usecols是指定要保留的列集合,只需将target_col_count替换为len(usecols)即可。
内容的提问来源于stack exchange,提问作者Lanti
相关产品推荐
相关产品推荐

