【问题标题】:How to delete rows having bad error lines and read the remaining csv file using pandas or numpy?如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
【发布时间】: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'

【问题讨论】:

    标签: python pandas numpy csv


    【解决方案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'])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2018-09-18
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多