这是一个概念性问题,因此没有代码或可复制的示例。
我正在处理从数据库中提取的数据,该数据库包含来自自动化过程的记录。常规记录包含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设置为返回数据帧的某个函数。我的hack解决方案是手动逐行修改数据,并从输出中创建两个数据帧。使用关键字"failed."可以可靠地检测出坏线路的存在。我已经编写了收集"失败"的逻辑。消息并按日期生成堆叠条形图。它可以工作,但我宁愿使用一个完整的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')
使用遮罩拆分和构建单独的dataframe
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)