使用 pandas.read_csv() 处理格式错误的 csv 数据

问题描述 投票:0回答:2

这是一个概念性问题,因此没有代码或可重现的示例。

我正在处理从数据库中提取的数据,该数据库包含来自自动化流程的记录。常规记录包含 14 个字段,具有唯一 ID,还有 13 个字段包含指标,例如创建日期、执行时间、客户 ID、作业类型等。数据库以每天几十条、每月几千条的速度积累记录。

有时,该过程会导致错误,从而导致格式错误的行。这是一个例子:

id1,m01,m02,m03,m04,m05,m06,m07,m08,m09,m10,m11,m12,m13 /*regular record, no error, 14 fields*/
id2,m01,m02,m03,m04,m05,m06,m07,m08,m09,m10,m11,m12,"DELETE error, failed" /*error in column 14*/
id3,m01,m02,"NO SUCH JOB error, failed" /*error in column 4*/
id4,m01,m02,m03,m04,m05,m06,"JOB failed, no time recorded" /*error in column 7*/

要求是 (1) 根据指标填充仪表板,以及 (2) 对错误类型进行分类。理想的解决方案使用 read_csv 并将 on_bad_lines 设置为返回数据帧的某个函数。我的黑客解决方案是手动逐行整理数据,并从输出中创建两个数据帧。通过使用关键字“failed”可以可靠地检测到坏线的存在。我已经编写了收集“失败”消息并按日期生成堆积条形图的逻辑。它有效,但我宁愿使用完整的 Pandas 解决方案。

是否可以使用 pd.read_csv() 返回 2 个数据帧?如果是这样,这将如何完成?你能指点我任何示例代码吗?或者我完全偏离了基地?谢谢。

python pandas csv
2个回答
1
投票

您可以将 csv 文件加载到 Dataframe 上并应用过滤器:

df = pd.read_csv("your_file.csv", header = None)
df_filter = df.apply(lambda row: row.astype(str).str.contains('failed').any(), axis=1) 

df[df_filter.values] #this gives a dataframe of "failed" rows
df[~df_filter.values] #this gives a dataframe of "non failed" rows

您需要确保您的关键字不会出现在您的数据中。

PS:可能还有更优化的方法


0
投票

此方法将整个 CSV 读取到单个列中。然后使用识别失败行的掩码来分解并创建良好和失败的数据帧。

将整个 CSV 读取到单列中

import io

dfs = pd.read_fwf(sim_csv, widths=[999999], header=None)

构建一个标识失败行的掩码

fail_msk = dfs[0].str.contains('failed')

使用该掩码来拆分并构建单独的数据帧

df_good = pd.read_csv(io.StringIO('\n'.join(dfs[~fail_msk].squeeze())), header=None)
df_fail = pd.read_csv(io.StringIO('\n'.join(dfs[fail_msk].squeeze())), header=None)
© www.soinside.com 2019 - 2024. All rights reserved.