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'