Pandas pd.read_csv не работает для простого sep = ',' - PullRequest
0 голосов
/ 24 ноября 2018

Добрый день всем.

Я знаю, что это довольно простой вопрос, хотя я просто не понимаю, почему он не работает так, как я ожидал.

Задача следующая:

У меня есть файл data.csv, представленный в этом формате:

id,"feature_1","feature_2","feature_3"
00100429,"PROTO","Proprietary","Phone"
00100429,"PROTO","Proprietary","Phone"

Дело в том, чтобы импортировать эти данные, используя панд.Я знаю, что по умолчанию pandas read_csv использует разделитель запятых, поэтому я просто импортировал его следующим образом:

data = pd.read_csv('data.csv')

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

Я пробовал много других разделителей, используя регулярные выражения, и единственный, который внес какое-то улучшение, был:

data = pd.read_csv('data.csv',sep="\,",engine='python')

С одной стороны, он окончательно отделилсявсе столбцы, с другой стороны, способ представления данных не так удобен для использования.В частности:

"id         ""feature_1""   ""feature_2""   ""feature_3"""
"00100429   ""PROTO""       ""Proprietary"" ""Phone"""

Поэтому я думаю, что где-то должна быть ошибка, потому что данные вроде бы в порядке.

Итак, вопрос - как импортировать CSV-файл с разделенными столбцами и без символов тройных кавычек?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вот мое быстрое решение вашей проблемы -

import numpy as np
import pandas as pd

### Reading the file, treating header as first row and later removing all the double apostrophe 
df = pd.read_csv('file.csv', sep='\,', header=None).apply(lambda x: x.str.replace(r"\"",""))
df

    0              1           2       3
0   id      feature_1   feature_2   feature_3
1   00100429    PROTO   Proprietary Phone
2   00100429    PROTO   Proprietary Phone

### Putting column names back and dropping the first row.
df.columns = df.iloc[0]
df.drop(index=0, inplace=True)
df

## You can reset the index 
        id  feature_1   feature_2   feature_3
1   00100429    PROTO   Proprietary Phone
2   00100429    PROTO   Proprietary Phone

### Converting `id` column datatype back to `int` (change according to your needs)

df.id = df.id.astype(np.int)
np.result_type(df.id)

dtype('int64')
0 голосов
/ 24 ноября 2018

Вот только альтернативный способ ответа dataLeo -

import pandas as pd
import numpy as np

Чтение файла в кадре данных и последующее удаление всего двойного апострофа из значений строки

df = pd.read_csv("file.csv", sep="\,").apply(lambda x: x.str.replace(r"\"",""))
df

    "id"   "feature_1"  "feature_2" "feature_3"
0   00100429    PROTO   Proprietary Phone
1   00100429    PROTO   Proprietary Phone

Удаление всех двойных апострофов из имен столбцов

df.columns = df.columns.str.replace('\"', '')
df

      id    feature_1   feature_2   feature_3
0   00100429    PROTO   Proprietary Phone
1   00100429    PROTO   Proprietary Phone

Преобразование типа данных столбца id обратно в int (изменить в соответствии с вашими потребностями)

df.id = df.id.astype('int')
np.result_type(df.id)

dtype('int32')
0 голосов
/ 24 ноября 2018

Он должен работать без проблем с sep до тех пор, пока в вашем CSV-файле не появится что-то действительно плохое. Однако, имитируя ваш пример данных, он работает для меня:

Согласно вашему образцу данных, выне нужно экранировать char \ для значений, разделенных запятыми.

>>> import pandas as pd
>>> data = pd.read_csv("sample.csv", sep=",")
>>> data
       id feature_1    feature_2 feature_3
0  100429     PROTO  Proprietary     Phone
1  100429     PROTO  Proprietary     Phone
>>> pd.__version__
'0.23.3'

Здесь есть проблема, как я заметил sep="\,"

В качестве альтернативы Попробуйте:

  • Здесь skipinitialspace=True - это «относится к пробелам после разделителя запятых»

  • quotechar='"': строка (длина 1)Символ, используемый для обозначения начала и конца цитируемого элемента.Цитируемые элементы могут включать в себя разделитель, и он будет игнорироваться.

Итак, в этом случае стоит попробовать ..

>>> data1 = pd.read_csv("sample.csv", skipinitialspace = True, quotechar = '"')
>>> data1
       id feature_1    feature_2 feature_3
0  100429     PROTO  Proprietary     Phone
1  100429     PROTO  Proprietary     Phone

Примечание от Pandas doc:

Разделители длиннее 1 символа и отличные от '\ s +' будут интерпретироваться как регулярные выражения, заставят использовать механизм синтаксического анализа python и будут игнорировать кавычки в данных.

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