熊猫:读取包含多个标题的CSV文件

时间:2018-12-17 15:53:33

标签: pandas

我使用以下(脱字符号)定界的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 :(得分:1)

要保留两个标题行,我建议从数据的前两行创建一个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