Чтение csv-файла в pandas dataframe с цитатой в некоторых записях - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть CSV-файл, такой как

идентификатор, тело, категория, подкатегория, номер, smstype, smsflag

50043, «Уважаемый клиент, спасибо за регистрацию» ,,, DM-YEBA, входящие, 0

30082, Поздравляю!Ваша учетная запись была активирована. ,,, DM-SBAW, входящие, 0

, когда я использую pd.read_csv(), тогда все первое наблюдение включается в столбец id и не разделяетсясреди других столбцов из-за двойных кавычек, используемых для тела сообщения, в то время как во втором наблюдении строка должным образом разделена между столбцами.

Что делать, чтобы первое наблюдение было разделено среди всех столбцов, как в этомimage enter image description here

Посмотрите, что на самом деле делает pd.read_csv.Он берет все наблюдение в столбце id vhjn

, когда я открываю CSV-файл в блокноте, он добавляет дополнительные кавычки ко всей строке, что в конечном итоге вызывает фиаско и цитатуметка, уже находящаяся в файле, экранируется с другим символом "" ", как показано ниже.

id, тело, категория, подкатегория, номер, smstype, smsflag

" 50043, "" УважаемыйКлиент, Благодарим Вас за регистрацию "" ,, DM-YEBA, входящие, 0 "

30082, Поздравляем! Ваш аккаунт был активирован. ,,, DM-SBAW, Входящие, 0

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Основная проблема заключается в том, как на самом деле сохраняется CSV-файл Microsoft Excel.Когда тот же файл CSV открывается в блокноте, он добавляет дополнительные кавычки в строках, которые имеют кавычки.

1) Добавляет кавычки в начале и конце строки.

2) Экранирует существующие кавычки еще одной кавычкой.Следовательно, когда мы импортируем наш CSV-файл в pandas, он принимает всю строку как одну строку и, таким образом, все заканчивается в первом столбце.

Для решения этой проблемы -

Я импортировалCSV-файл и исправил CSV, применяя подстановку регулярных выражений и сохранил его в виде текстового файла.Затем я импортировал этот текстовый файл как pandas dataframe.Проблема решена.

with open('csvdata.csv','r+') as csv_file:
for line in csv_file:
    # removing starting and ending quotes of a line
    pattern1 = re.compile(r'^"|"$',re.MULTILINE)
    line = re.sub(r'^"|"$',"",line)
    # substituting escaped quote with a single quote
    pattern2 = re.compile(r'""')
    line = re.sub(r'""','"',line)

    corrected_csv = open("new_csv.txt",'a')
    corrected_csv.write(line)
    corrected_csv.close()
0 голосов
/ 26 сентября 2018

В вашем примере проблема заключается в том, что начальная кавычка Dear customer ... не совпадает с закрывающей кавычкой (разные символы).Кажется, проблема в ваших данных, а не в pandas.read_csv

Если у вас всегда один и тот же символ кавычки, вы, вероятно, ищете аргумент quotechar='"' для read_csv.Более подробную информацию можно найти здесь: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

0 голосов
/ 27 сентября 2018

Кажется, что (по умолчанию) символ двойной кавычки распознается как представляющий начало единственного числа, если он следует сразу после символа разделителя (то есть без пробелов между запятой и двойной кавычкой).Вы можете решить эту проблему, используя входной аргумент skipinitialspace=True (т.е. игнорируйте пробелы после разделителя).Следующий код:

import io
import pandas as pd

# Create virtual CSV file
csv_file = io.StringIO(
    'id, body, category, subcategory, number, smstype, smsflag\n'
    '50043, "Dear Customer,Thank you for registering",, , DM - YEBA, inbox, 0\n'
    '30082, Congrats! Your account has been activated.,, , DM - SBAW, inbox, 0\n'
)

# Read out CSV file
df = pd.read_csv(csv_file, skipinitialspace=True)

дает следующий результат:

In [1]: df
Out[1]: 
      id                                        body   ...     smstype  smsflag
0  50043     Dear Customer,Thank you for registering   ...       inbox        0
1  30082  Congrats! Your account has been activated.   ...       inbox        0
[2 rows x 7 columns]
0 голосов
/ 26 сентября 2018

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

import re
for i in range(0,len(df['body'])):
    df['body'][i] = re.sub('\W+','', df['body'][i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...