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

Расширение Проблемы с чтением 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

Требуемый выходной фрейм данных Pandas:

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:

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 803
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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 пытается прочитать, и соответствующим образом измените только эти строки.

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

Ответ принят как подходящий

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

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] (в нижнем регистре). Распечатайте содержимое набора, затем добавьте его в сценарий и перезапустите его.

Это отлично работает !!! Но что, если у меня есть столбец (похожий на столбец адреса с запятыми, поскольку это символы в некоторых строках) рядом со столбцом адреса вместо столбца телефона? Я имею в виду, если два нечисловых столбца с одинаковой проблемой присутствуют в наборе данных рядом с каждым другое, тогда будет сложно их различить, используя вышеуказанное решение, не так ли?

Avinash Clinton 14.05.2018 14:04

Пожалуйста, редактировать ваш вопрос, чтобы включить другой пример, показывающий это. Тем не менее, невозможно угадать, какие данные какому столбцу принадлежат полностью универсальным способом. Лучшее решение - обеспечить правильное экранирование данных при их создании. Может быть, вы могли бы показать, как создаются данные?

Martin Evans 14.05.2018 14:18

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

Avinash Clinton 16.05.2018 07:59

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

Martin Evans 16.05.2018 12:59

Другие вопросы по теме