У pd.read_csv есть проблемы с различным количеством столбцов между CSV-файлами - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть количество CSV-файлов с различным количеством столбцов. Большинство CSV-файлов имеют ширину 4 столбца и считываются и объединяются. Однако, когда он встречает файлы, которые превышают 4 столбца, сценарий выдает ошибку.

Я получаю следующее сообщение об ошибке: Error tokenizing data. C error: Expected 4 fields in line 125, saw 8.

Если я рефакторинг кода (ниже), чтобы включить error_bad_lines=False для pd.read_csv, код завершает и выводит комбинированный CSV, который включает в себя только строки, которые содержат 4 столбца.

Как я могу решить эту ошибку и объединить все? Там нет индексов, поэтому мне просто нужно разместить информацию о csv друг над другом.

Большое спасибо

import os
import glob
import pandas as pd


all_filenames = [
   # think this is working correctly with bunch of replies.csv extensions
   i for i in glob.glob('C:\\Users\\tkim1\\Python Scripts\\output\\*\\replies.csv')
] 

print(all_filenames)

# combine all files in the list
combined_csv = pd.concat([
   pd.read_csv(f, error_bad_lines=False) for f in all_filenames
], sort=False)

# export to csv
combined_csv.to_csv("combined_replies.csv", index=False, encoding='utf-8-sig')

1 Ответ

0 голосов
/ 05 апреля 2020

Проблема здесь в pandas .concat, а не pandas .read_csv. Функция concat не позволяет объединять объекты DataFrame с различным количеством столбцов.

Единственный способ решить эту проблему - это найти DataFrames с меньшим числом столбцов (чем DataFrame с max количество столбцов), установите необходимые дополнительные столбцы в каждом кадре данных на NaN, затем примените pd.concat.

# for example, if df1 has 3 columns and df2 has 2 columns, set the third column in df2 
# to NaN, then apply concat.

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'0': np.arange(1, 100), 
                    '1': np.arange(100, 1, -1)})
df2 = pd.DataFrame({'0': np.arange(100, 200), 
                    '1': np.arange(200, 100, -1), 
                    '2': np.arange(400, 500)})
df2['2'] = np.nan
df3 = pd.concat([df1, df2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...