Символ табуляции сохраняется, когда только одна строка не имеет значения в поле, иначе нет - PullRequest
1 голос
/ 22 апреля 2020

Context

У меня есть файл csv с точкой с запятой ';' в качестве разделителя:

(...)
Processing file;  67/100; id;    27209;   107; words written.   Time;   4.55; s
Processing file;  68/100; id;    17103;    14; words written.   Time;   4.42; s
Processing file;  69/100; id;    17090;      ; ('Error, no record fetch from query for file 17090.',).  Time;   0.01; s
Processing file;  70/100; id;    10947;    40; words written.   Time;   4.63; s
Processing file;  71/100; id;    17937;    50; words written.   Time;   4.47; s
(...)

Также есть несколько символов tab .

Я хотел бы загрузить этот CSV в Pandas DataFrame .

Для этого я использую pandas .read_csv() метод;

import pandas as pd
file = '/path/to/file.csv'
df = pd.read_csv(file, sep=';', skiprows=1, header=None)
df.drop([0,2,5,7], axis=1, inplace=True)    

Я отбрасываю столбцы, содержащие только текстовую информацию, потому что они мне не нужны для дальнейшей обработки данных.

Когда средняя строка файла csv (та, которая содержит ошибка) отсутствует, все работает нормально, и DataFrame выглядит следующим образом:

           1      3    4     6
66    67/100  27209  107  4.55
67    68/100  17103   14  4.42
69    70/100  10947   40  4.63
70    71/100  17937   50  4.47

Со следующими типами данных:

In [4]: df2.dtypes
Out[4]: 
1     object
3      int64
4      int64
6    float64
dtype: object

До удаления столбца типичная строка следующим образом:

In [2]: df.iloc[0]
Out[2]: 
0                 Processing file
1                           1/100
2                              id
3                           17889
4                              17
5            words written.\tTime 
6                             3.1
7                               s
Name: 0, dtype: object

Но когда эта строка присутствует, у меня возникает проблема, так как кажется, что символы табуляции хранятся в столбцах, когда в одной строке нет числового значения c ( т.е. строка с ошибкой);

           1      3        4     6
66    67/100  27209  \t  107  4.55
67    68/100  17103  \t   14  4.42
68    69/100  17090  \t       0.01
69    70/100  10947  \t   40  4.63
70    71/100  17937  \t   50  4.47

Со следующими типами данных:

In [8]:df.dtypes
Out[8]: 
1     object
3      int64
4     object
6    float64
dtype: object

Опять же, до удаления столбца типичная строка выглядит следующим образом:

In [2]: df.iloc[0]
Out[2]: 
0              Processing file
1                        1/100
2                           id
3                        17346
4                      \t    6
5         words written.\tTime 
6                         7.42
7                            s

Эта дополнительная вкладка явно не приветствуется в моих вычислениях, поскольку она меняет тип моего 4-го столбца. Конечно, я могу избавиться от него, обработав DataFrame, например:

df[4] = df[4].replace('\t','', regex=True)
df[4] = df[4].str.strip()
df[4] = pd.to_numeric(df[4])

Но тогда тип столбца 4, если float64, а не int64, потому что float кажется единственный, кто имеет дело с пустым значением или NaN, ответил здесь и объяснил здесь; https://pandas.pydata.org/pandas-docs/stable/user_guide/gotchas.html#support -for-integer-na .

Я бы лично предпочел избавиться от символа табуляции при чтении файла CSV, т. Е. При использовании метода .read_csv().
I немного исследовал параметр na_values, например, установив na_values='\t' во время чтения файла, но он явно не работает, так как символ табуляции присутствует в каждой строке.
Я также попытался определить разделитель как sep=';\t' и добавив engine=python во время чтения файла, но точка с запятой все еще там, даже если я указал это в опции sep.

Вопрос

Почему Pandas может правильно прочитать мой CSV-файл с кучей вкладок, когда нет средних строк, и он обманывается, когда он там?
И как это исправить?

Среда

Ubuntu 18.04
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
Pandas '1.0.3'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...