如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

Posted

技术标签:

【中文标题】如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?【英文标题】:How to delete rows having bad error lines and read the remaining csv file using pandas or numpy? 【发布时间】:2020-01-29 10:13:36 【问题描述】:

由于以下解析器错误,我无法读取我的 dataset.csv 文件。

Error tokenizing data. C error: Expected 1 fields in line 8, saw 4

CSV 文件是通过另一个程序生成的。 基本上我想跳过在特定间隔后迭代的字符行,只需要我的数据集中的整数和浮点值。 我试过这个:

df = pd.read_csv('Dataset.csv')

我也试过这个,但我只得到坏行作为输出。但我想跳过所有这些错误的错误行,只显示我的数据集中的剩余值。

df = pd.read_csv('Dataset.csv',error_bad_lines=False, engine='python')

数据集:

The pch2csv utility program
This file contains the pch2csv


$TITLE   =
$SUBTITLE=
$LABEL   = FX
1,0.000000E+00,3.792830E-06,-1.063093E-06
2,0.000000E+00,-1.441319E-06,4.711234E-06
3,0.000000E+00,2.950290E-06,-5.669502E-07
4,0.000000E+00,3.706791E-06,-1.094726E-06
5,0.000000E+00,3.689831E-06,-1.107476E-06

$TITLE   =
$SUBTITLE=
$LABEL   = FY
1,0.000000E+00,-5.878803E-06,1.127179E-06
2,0.000000E+00,2.782207E-06,-8.840886E-06
3,0.000000E+00,-1.574296E-06,3.867732E-07
4,0.000000E+00,-6.227912E-06,1.864081E-06
5,0.000000E+00,-3.113227E-05,9.339538E-06

预期数据集:

*如果可能,甚至可以删除空白行 第一列应设置为索引,最终数据集必须仅包含第一列和第三列,如图所示。列标签必须设置为'1'

【问题讨论】:

【参考方案1】:

您可以为新列名称添加参数namesread_csv - 然后获取一些缺少值的行,因此添加了DataFrame.dropna

import pandas as pd
from io import StringIO


temp="""The pch2csv utility program
This file contains the pch2csv


$TITLE   =
$SUBTITLE=
$LABEL   = FX
1,0.000000E+00,3.792830E-06,-1.063093E-06
2,0.000000E+00,-1.441319E-06,4.711234E-06
3,0.000000E+00,2.950290E-06,-5.669502E-07
4,0.000000E+00,3.706791E-06,-1.094726E-06
5,0.000000E+00,3.689831E-06,-1.107476E-06

$TITLE   =
$SUBTITLE=
$LABEL   = FY
1,0.000000E+00,-5.878803E-06,1.127179E-06
2,0.000000E+00,2.782207E-06,-8.840886E-06
3,0.000000E+00,-1.574296E-06,3.867732E-07
4,0.000000E+00,-6.227912E-06,1.864081E-06
5,0.000000E+00,-3.113227E-05,9.339538E-06"""

#after testing replace 'pd.compat.StringIO(temp)' to 'Dataset.csv'
df = pd.read_csv(StringIO(temp),
                 error_bad_lines=False, 
                 engine='python', 
                 names=['a','b','c','d'])

df = df.dropna(subset=['b','c','d'])  
print (df)
    a    b         c             d
0   1  0.0  0.000004 -1.063093e-06
1   2  0.0 -0.000001  4.711234e-06
2   3  0.0  0.000003 -5.669502e-07
3   4  0.0  0.000004 -1.094726e-06
4   5  0.0  0.000004 -1.107476e-06
8   1  0.0 -0.000006  1.127179e-06
9   2  0.0  0.000003 -8.840886e-06
10  3  0.0 -0.000002  3.867732e-07
11  4  0.0 -0.000006  1.864081e-06
12  5  0.0 -0.000031  9.339538e-06

编辑:

将第一列设置为索引和其他列名称:

#after testing replace 'pd.compat.StringIO(temp)' to 'Dataset.csv'
df = pd.read_csv(StringIO(temp),
                 error_bad_lines=False, 
                 engine='python', 
                 index_col=[0],
                 names=['idx','col1','col2','col3'])

#check all columns, first column is set to index, so not tested
df = df.dropna() 

#if need test if all values in row has NaNs
#df = df.dropna(how='all')  
print (df)
     col1      col2          col3
idx                              
1     0.0  0.000004 -1.063093e-06
2     0.0 -0.000001  4.711234e-06
3     0.0  0.000003 -5.669502e-07
4     0.0  0.000004 -1.094726e-06
5     0.0  0.000004 -1.107476e-06
1     0.0 -0.000006  1.127179e-06
2     0.0  0.000003 -8.840886e-06
3     0.0 -0.000002  3.867732e-07
4     0.0 -0.000006  1.864081e-06
5     0.0 -0.000031  9.339538e-06

编辑1:

如果需要删除由0 填充的所有列:

df = df.loc[:, df.ne(0).any()]
print (df)
         col2          col3
idx                        
1    0.000004 -1.063093e-06
2   -0.000001  4.711234e-06
3    0.000003 -5.669502e-07
4    0.000004 -1.094726e-06
5    0.000004 -1.107476e-06
1   -0.000006  1.127179e-06
2    0.000003 -8.840886e-06
3   -0.000002  3.867732e-07
4   -0.000006  1.864081e-06
5   -0.000031  9.339538e-06

【讨论】:

是否可以为 A 列设置索引,并且输出 df 必须仅根据您的命名约定包含“a”和“c”列? @Axay - 请检查编辑 - 根据需要更改列名。 是否有任何选项可以将完整的 csv 最初设置为 temp?因为我有一个非常大的 csv,并且无法手动选择所有内容作为 temp。 @Axay - 也许你想念after testing replace 'pd.compat.StringIO(temp)' to 'Dataset.csv' - 所以用真实数据使用df = pd.read_csv('Dataset.csv', error_bad_lines=False, engine='python', index_col=[0], names=['idx','col1','col2','col3'])

以上是关于如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:删除缺少数据的行并在 UDF 中应用二进制编码

使用正则表达式仅选择带有错误代码 (-) 的行并忽略其他行

隐藏或删除行后如何更新 HTML 表中的行索引?

Pandas 删除列包含 * 的行

pandas 数据框的颜色行并转换为 HTML 表

Python Pandas 遍历行并访问列名