我使用以下(脱字符号)定界的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
并且我需要在保留标题顺序的同时读取文件,以便输出匹配以下内容:
但是,当我尝试时:
df = pd.read_csv(source_file, header=[0,1], sep=r"[| ^]", engine='python')
我得到:
如果我尝试:
df = pd.read_csv(source_file, header=[1], sep=r"[| ^]",engine='python')
我刚得到:
有什么方法可以同时导入两个标头?如果我们可以删除标题的开括号和结尾括号而无需在文件中的其他位置删除它们,则有加分。
注意:我有sep=r"[| ^]
,因为文件也可以用管道定界。
答案 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