Pandas read_csv добавляет имена заголовков в случае изменения количества столбцов - PullRequest
0 голосов
/ 25 июня 2018

У меня есть много csv-файлов, которые я хотел бы прочитать с помощью Pandas (pd.read_csv), однако в некоторых файлах добавлен столбец на полпути без заголовка, как в этом примере:

Apples, Pears
1, 2
3, 4
5, 6, 7

При использовании pd.read_csv (example_file) выдается следующая ошибка: « ParserError: Ошибка токенизации данных. Ошибка C: Ожидается 2 поля в строке 4, пила 3 ​​"

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

Apples, Pears, Unknown1  
1, 2, np.nan
3, 4, np.nan
5, 6, 7

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Если вы заранее не знаете количество столбцов, вы можете определить максимальное количество столбцов во всех строках заранее, используя readlines(), что происходит за счет потери известных имен заголовков.

sep = ','                                                   # Define separator
lines = open("test.csv").readlines()                        # Open file and read lines
colcount = max([len(l.strip().split(sep)) for l in lines])  # Count separator
df = pd.read_csv("test.csv", names = range(colcount), skiprows = [0])
print df

   0  1    2
0  1  2  NaN
1  3  4  NaN
2  5  6  7.0

Выше colcount можно применить и ко всем остальным ответам.


Редактировать: Остерегайтесь входных файлов, отличных от .csv (см. Комментарии)

0 голосов
/ 25 июня 2018

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

>>> import pandas as pd
>>> names = list(pd.read_csv('foo.csv', nrows=0)) + ['unknown1', 'unknown2']
>>> df=pd.read_csv('foo.csv', names=names, skiprows=1).dropna(axis='columns', how='all')
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0

Если естьмного лишних столбцов, и вы беспокоитесь об объеме памяти промежуточного кадра данных, вы можете использовать модуль csv для сканирования файла и вычисления максимального количества строк.В отличие от pandas, csv очень рад излучать строки различного размера.

>>> with open('foo.csv', newline='') as in_fp:
...     reader = csv.reader(in_fp)
...     header = next(reader)
...     num_cols = max(len(row) for row in reader)
... 
>>> names = header + ['unknown{}'.format(i+1) for i in range(num_cols-len(header))]
>>> df = pd.read_csv('foo.csv', names=names, skiprows=1)
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0
0 голосов
/ 25 июня 2018

Мы можем загрузить CSV, затем исправим ваш

import io
t="""Apples, Pears
1, 2
3, 4
5, 6, 7"""
df = pd.read_csv(io.StringIO(t), sep='\t')

yourdf=df.iloc[:,0].str.split(', ',expand=True)
s=df.columns.str.split(', ').tolist()[0]
yourdf.columns=s+['unknow'+str(x+1) for x in range(yourdf.shape[1]-len(s))]


yourdf
Out[104]: 
  Apples Pears unknow1
0      1     2    None
1      3     4    None
2      5     6       7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...