После того, как я столкнулся с некоторыми битыми CSV-файлами в прошлом, я работаю над небольшим кодом Python, который позволяет отфильтровывать эти ошибочные строки, чтобы я мог вручную проверить их на наличие паттернов и, если возможно, исправить их.
Однако, когда я хочу добавить правильное количество столбцов, я ожидаю, что файл будет иметь, я получаю только наиболее частое наблюдение "режима" в разделителе в первой строке, а не во всех строках.
ЭтоРазбитый файл CSVS обычно появляется, если в строке больше разделительных разделителей, чем в столбцах (например, если у имени клиента также есть символ «а», а затем Excel разбивает его, а также перемещает все столбцы на один вправо).для каждого чанка, который я загружаю, вижу количество разделителей в первом столбце, сравниваю его с «правильным» количеством разделителей для чанка (я упрощаю это, используя режим как консенсус), а затем просто отправляю эти ошибочные строки в список.
Я полагаю, что ошибка возникает из-за того, что я использую панд, я новичок в кодировании, и хотя панды кажутся идеальными для обработки данных, я все еще читаю о том, как правильно обращаться к столбцам и строкам.
Код проходит через мои сотни CSV-файлов, загружает их в виде кусочков на основе совершенно необычного разделителя в этом случае |.Это создает фрейм данных, в котором вся строка csv объединена в одном поле, что позволяет мне, в свою очередь, подсчитать правильный разделитель (в данном случае;).
la=[]
for filename in all_files:
for chunk in pd.read_csv(filename, sep='|', chunksize=1000000):
chunk['filename'] = os.path.basename(filename)
chunk["delimeters"] = chunk.iloc[:,0].str.count(',')
chunk['good delimeter'] = chunk["delimeters"].mode()
for index, row in chunk.iterrows():
if row['delimeters'] != chunk['good delimeter']:
la.append(row)
else:
print("all good")
print(la)
В настоящее время моей главной проблемой является то, что когдаЯ смотрю в свой блок данных чанка, счетчик разделителей работает хорошо, однако режим добавляется только к первой строке, поэтому, когда я смотрю на чанк, он выглядит следующим образом:
Name| Filename| delimetier| good delimeter
A 123 48 48
B 123 48 Nan
C 123 49 Nan
D 123 48 Nan
Однако я хотел бы иметь режимстолбца разделителя, добавленного ко всем, чтобы я мог сравнить их с оператором if и отфильтровать строки ошибок.
При запуске этого сценария для этого поста я также сталкиваюсь со следующей ошибкой:
ValueError: Значение истинности Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().
Однако я предполагаю, что это ошибка наблюдения, вызванная Nan