Панды: читать CSV с несколькими заголовками - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть следующий CSV (каретка) с разделителями (файл должен быть в этом формате):

HEADER^20181130
[Col1]^[Col2]^[Col3]^[Col4]^[Col5]
The^quick^"bro,wn"^fox^jumped
over^the^fat^lazy^dog
m1213^4,12r4^fr,34^,56,gt^12fr,12fr
Trailer^N

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

enter image description here

Однако, когда я пытаюсь:

df = pd.read_csv(source_file, header=[0,1], sep=r"[| ^]", engine='python')

я получаю:

enter image description here

и если я попытаюсь:

df = pd.read_csv(source_file, header=[1], sep=r"[| ^]",engine='python')

, я просто получаю:

enter image description here

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

Примечание: у меня есть sep=r"[| ^], поскольку файл также может быть разделен с помощью труб.

1 Ответ

0 голосов
/ 18 декабря 2018

Чтобы сохранить обе строки заголовка, я бы предложил создать pd.Multindex из первых двух строк ваших данных.

Поэтому вам нужно будет импортировать данные без заголовка.

import numpy as np
import pandas as pd

df = pd.read_csv('~/Desktop/stackoverflow_data.csv', sep=r"[| ^]", header=None, engine='python')
df.reset_index(inplace=True)
df.fillna(np.nan, inplace=True)
df.head()

Вывод:

    level_0     level_1     level_2     0   1
0   HEADER  20181130    NaN     NaN     NaN
1   [Col1]  [Col2]  [Col3]  [Col4]  [Col5]
2   The     quick   "bro,wn"    fox     jumped
3   over    the     fat     lazy    dog
4   m1213   4,12r4  fr,34   ,56,gt  12fr,12fr

Затем вам нужно будет сжать две первые строки как кортежи (и, между прочим, удалить квадратные скобки) и создать объект Multindex:

cols = tuple(zip(df.iloc[0], df.iloc[1].apply(lambda x: x[1:-1])))

header = pd.MultiIndex.from_tuples(cols, names=['Lvl_1', 'Lvl_2'])

# delete the header rows and assign new header
df.drop([0,1], inplace=True)
df.columns = header

df.head()

Это вывод:

Lvl_1   HEADER 20181130       NaN                   
Lvl_2     Col1     Col2      Col3    Col4       Col5
2          The    quick  "bro,wn"     fox     jumped
3         over      the       fat    lazy        dog
4        m1213   4,12r4     fr,34  ,56,gt  12fr,12fr
5      Trailer        N       NaN     NaN        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...