Проблемы чтения файла CSV с запятыми в Pandas - PullRequest
0 голосов
/ 14 мая 2018

Расширение до Проблемы с чтением CSV-файла с запятыми и символами в пандах

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

Что, если существует более одного столбца с вышеуказанной проблемой?

Пример содержимого CSV с дополнительной запятой:

Name,Age,Address,Phone,Qualification
Suresh,28,Texas,3334567892,B.Tech
Ramesh,24,NewYork, NY,8978974040,9991111234,Ph.D
Mukesh,26,Dallas,4547892345,Ph.D

Обязательные выходные пандыDataFrame:

Name    Age  Address      Phone                  Qualification
Suresh  28   Texas        3334567892             B.Tech
Ramesh  24   NewYork, NY  8978974040,9991111234  Ph.D
Mukesh  26   Dallas       4547892345             Ph.D

Отредактировано:

Входной файл с запятыми в виде символов в последовательных столбцах:

Name,Age,Address,Qualification,Grade                  
Suresh,28,Texas,B.Tech,Ph.D,A
Ramesh,24,NewYork, NY,B.Tech,A+
Mukesh,26,Dallas,B.Tech,Ph.D,A

Обязательный выходной Pandas DataFrame:

Name    Age  Address      Qualification Grade                  
Suresh  28   Texas        B.Tech,Ph.D   A
Ramesh  24   NewYork, NY  B.Tech        A+
Mukesh  26   Dallas       B.Tech,Ph.D   A

Могу ли я получить какие-либо предложения для решения этой проблемы?

Заранее спасибо !!!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Ваши данные выглядят фиксированными как для первых двух столбцов, так и для последнего, поэтому их можно удалить, а оставшиеся значения можно обработать с помощью itertools.groupby(), чтобы сгруппировать оставшиеся столбцы в числовые или нечисловые группы.Полученные данные затем можно загрузить в панды:

import pandas as pd
from itertools import groupby
import csv

data = []

with open('input.csv', newline='') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)

    for row in csv_input:
        addr_phone = [','.join(g) for k, g in groupby(row[2:-1], lambda x: x.isdigit())]
        data.append(row[:2] + addr_phone + [row[-1]])

df = pd.DataFrame(data, columns=header)        
print(df)

Дать вам:

     Name Age      Address                  Phone Qualification
0  Suresh  28        Texas             3334567892        B.Tech
1  Ramesh  24  NewYork, NY  8978974040,9991111234          Ph.D
2  Mukesh  26       Dallas             4547892345          Ph.D

Для работы со вторым примером вам нужно будет выбрать способразделить две колонки.Я бы предложил вам составить список возможных квалификаций.Когда есть совпадение, вы сможете разделить на этом этапе.Например:

import pandas as pd
import csv

def find_split(data):
    for index, v in enumerate(data):
        if v.lower() in ['b.tech', 'ph.d']:
            return [', '.join(data[:index]), ', '.join(data[index:])]
    return [', '.join(data), '']

data = []

with open('input.csv', newline='') as f_input:
    csv_input = csv.reader(f_input, skipinitialspace=True)
    header = next(csv_input)

    for row in csv_input:
        data.append(row[:2] + find_split(row[2:-1]) + [row[-1]])

df = pd.DataFrame(data, columns=header)        
print(df)

Предоставление вам:

     Name Age      Address Qualification Grade
0  Suresh  28        Texas  B.Tech, Ph.D     A
1  Ramesh  24  NewYork, NY        B.Tech    A+
2  Mukesh  26       Dallas  B.Tech, Ph.D     A

Вы можете создать список квалификаций, сначала создав set() на основе содержимого row[2] (в нижнем регистре).Распечатайте содержимое набора, а затем добавьте его в сценарий и запустите его снова.

0 голосов
/ 14 мая 2018

Один из способов сделать это - иметь " для четкого разделения ваших данных -

Name,Age,Address,Phone,Qualification
Suresh,28,Texas,3334567892,B.Tech
Ramesh,24,"NewYork, NY","8978974040,9991111234",Ph.D
Mukesh,26,Dallas,4547892345,Ph.D

Если этого нет, pandas будет изо всех сил, чтобы прочитать это правильно.

Скопируйте вышеупомянутые данные, сделайте pd.read_clipboard(sep=','), и это даст -

     Name  Age      Address                  Phone Qualification
0  Suresh   28        Texas             3334567892        B.Tech
1  Ramesh   24  NewYork, NY  8978974040,9991111234          Ph.D
2  Mukesh   26       Dallas             4547892345          Ph.D

Если изменение исходных данных в целом не для вас -

Практическим подходом было бы сделать обычный read_csv с error_bad_lines=False. После этого просмотрите журналы и запишите строки, которые pandas пытается прочитать и измените только эти строки соответствующим образом.

Надеюсь, это поможет.

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