繁体   English   中英

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

[英]using pandas.read_csv() for malformed csv data

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

我正在处理从包含自动化流程记录的数据库中提取的数据。 常规记录包含 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 设置为返回数据帧的某个函数。 我的 hacky 解决方案是手动逐行处理数据,并从输出中创建两个数据帧。 使用关键字“失败”可以可靠地检测到坏行的存在。 我已经编写了收集“失败”消息并按日期生成堆积条形图的逻辑。 它有效,但我宁愿使用完整的 Pandas 解决方案。

是否可以使用 pd.read_csv() 返回 2 个数据帧? 如果是这样,这将如何完成? 你能指出我的任何示例代码吗? 还是我完全不在基地? 谢谢。

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

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:可能有更优化的方法来做到这一点

这种方法将整个 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM