如何使用 Python pandas 在 read_csv 期间识别不良记录?
Posted
技术标签:
【中文标题】如何使用 Python pandas 在 read_csv 期间识别不良记录?【英文标题】:How to identify bad records during read_csv using Python pandas? 【发布时间】:2022-01-19 05:34:06 【问题描述】:我有一个存储为 csv 文件的数据,其中包含 250 多列和 70 万条记录。我在读取选项期间遇到解析错误。我的目标不是解决它,而是调试/识别导致记录的错误
我已经提到了here、here、here 的帖子。所以,它不是重复的
当我尝试下面的代码时,我得到下面给出的解析错误
df1 = pd.read_csv('New__Document.csv',low_memory=False)
ParserError:标记数据时出错。 C 错误:预期有 258 个字段 第 14 行,看到 263
基于这个post,我遵循了以下建议,效果很好
df = pd.read_csv('New__Document.csv',low_memory=False,on_bad_lines='skip')
len(df) # returns 365902 records
但是,这会导致记录丢失。因此,我尝试了另一个建议
df1 = pd.read_csv('New__Document.csv',low_memory=False, sep='\t')
len(df1) # returns 762521 records.
但这不会以表格格式显示输出(由于制表符分隔符)。
我想以简洁的表格格式查看违规/不良记录(通过减去 = 396,619 条记录获得)。因为这个问题导致一半以上的数据集丢失。
那么,正在寻求您的帮助以了解导致此问题的原因吗?如果我能识别出那些导致错误的记录并将其以表格格式存储,这将有助于我复习
【问题讨论】:
【参考方案1】:我建议您编写一个脚本来首先修复错误的行。您首先需要了解无效行有什么问题。 首先使用以下脚本显示哪些行不包含与表头相同的行数:
import csv
with open('New_Document.csv') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
expected = len(header)
for line_number, row in enumerate(csv_input, start=2):
if len(row) != expected:
print(line_number, row)
然后,您需要决定如何修复这些行,例如为缺失值提供默认值。以下类型 然后可以使用脚本来修复错误的行:
import csv
with open('New_Document.csv') as f_input, open('fixed.csv', 'w', newline='') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
header = next(csv_input)
expected = len(header)
csv_output.writerow(header)
for line_number, row in enumerate(csv_input, start=2):
if len(row) != expected:
# Add logic here to fix missing entries, this pads the row with zeros
row.extend([0] * (expected - len(row)))
print(f"Fixed line line_number")
csv_output.writerow(row)
fixed.csv
然后应该使用 Pandas 正确加载
【讨论】:
以上是关于如何使用 Python pandas 在 read_csv 期间识别不良记录?的主要内容,如果未能解决你的问题,请参考以下文章
pandas.read_sql_query() 如何查询 TEMP 表?
使用 python 中 pandas 的 read_excel 函数将日期保留为字符串
python拾遗系列:pandas read_csv方法如何读取字符串变量