Как удалить строки с ошибочными строками ошибок и прочитать оставшийся CSV-файл, используя pandas или numpy? - PullRequest
1 голос
/ 30 сентября 2019

Я не могу прочитать свой файл 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

dataset

Ожидаемый набор данных:

* Даже пустые строки могут быть удалены, если это возможно. 1-й столбец должен быть задан как индекс, а окончательный набор данных должен содержать 1-й и 3-й столбцы только так, как показано. Метка столбца должна быть установлена ​​как «1»

enter image description here

1 Ответ

5 голосов
/ 30 сентября 2019

Вы можете добавить параметр names к read_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

EDIT1:

При необходимости удалить всестолбцы, заполненные только 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...