Расширение Проблемы с чтением 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
Могу ли я получить предложения по решению этой проблемы?
Заранее спасибо!!!






Один из способов сделать это - иметь " для четкого разделения ваших данных -
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] (в нижнем регистре). Распечатайте содержимое набора, затем добавьте его в сценарий и перезапустите его.
Пожалуйста, редактировать ваш вопрос, чтобы включить другой пример, показывающий это. Тем не менее, невозможно угадать, какие данные какому столбцу принадлежат полностью универсальным способом. Лучшее решение - обеспечить правильное экранирование данных при их создании. Может быть, вы могли бы показать, как создаются данные?
Входные данные предоставляются каким-то сторонним источником, поэтому во время создания их невозможно избежать, и такое поведение очень редко, поэтому должен быть способ обработать его с помощью некоторого настраиваемого фрагмента кода, поскольку я не могу игнорировать эти строки.
Вероятно, вам понадобится свой подход для каждого типа файла. Я обновил ответ, чтобы решить ваш второй пример.
Это отлично работает !!! Но что, если у меня есть столбец (похожий на столбец адреса с запятыми, поскольку это символы в некоторых строках) рядом со столбцом адреса вместо столбца телефона? Я имею в виду, если два нечисловых столбца с одинаковой проблемой присутствуют в наборе данных рядом с каждым другое, тогда будет сложно их различить, используя вышеуказанное решение, не так ли?