Python 当跨列标题为';时,如何将csv文件作为多索引数据帧读入;没有重复吗?

Python 当跨列标题为';时,如何将csv文件作为多索引数据帧读入;没有重复吗?,python,pandas,Python,Pandas,我有许多.csv文件,我想作为多索引数据帧读入,但跨列标题不会重复,因此我只剩下两个标题,而不是多索引 test.csv文件: A,,B,,C, a1,a2,b1,b2,c1,c2 1,1,1,1,1,1 2,2,2,2,2,2 当我运行以下命令时 import pandas as pd df = pd.read_csv('test.csv', header=[0,1]) print(df) 返回的结构不是我想要的: A Unnamed: 1_level_0 B Unnamed:

我有许多.csv文件,我想作为多索引数据帧读入,但跨列标题不会重复,因此我只剩下两个标题,而不是多索引

test.csv文件:

A,,B,,C,
a1,a2,b1,b2,c1,c2
1,1,1,1,1,1
2,2,2,2,2,2
当我运行以下命令时

import pandas as pd

df = pd.read_csv('test.csv', header=[0,1])
print(df)
返回的结构不是我想要的:

   A Unnamed: 1_level_0  B Unnamed: 3_level_0  C Unnamed: 5_level_0
  a1                 a2 b1                 b2 c1                 c2
0  1                  1  1                  1  1                  1
1  2                  2  2                  2  2                  2
我想要一个具有第一列标题的多索引,其作用如下:

   A     B     C 
  a1 a2 b1 b2 c1 c2
0  1  1  1  1  1  1
1  2  2  2  2  2  2
是否有一种方法可以读取csv,从而获得所需的结构?如果不是,最有效的方法是修改csv文件,使其显式地重复外部头文件值吗

A,A,B,B,C,C
a1,a2,b1,b2,c1,c2
1,1,1,1,1,1
2,2,2,2,2,2

我不知道在一行程序中有什么方法可以做到这一点,但您可以在python中修复它,而不是手动编辑文件

首先从
多索引
的第一个
级别
创建一个
系列
,确保按照
标签中给出的顺序对值进行排序

level_0 = pd.Series(df.columns.levels[0][df.columns.labels[0]])
然后将
'Unnamed:'
值转换为
None
,并执行
fillna
转发:

level_0[level_0.str.startswith('Unnamed: ')] = None
level_0 = level_0.fillna(method = 'ffill')
最后,将序列
索引
分配为
数据帧的
级别
标签

df.columns = pd.MultiIndex(levels = [level_0.values,
                                     df.columns.levels[1]],
                           labels = [level_0.index,
                                     df.columns.labels[1]])

也许有点小技巧-首先没有标题
header=None
,然后是第一行,从第一行和第二行创建新的
多索引,删除这些行,最后:


非常感谢。按需要工作。不知道这比我的答案要好多少,我的答案是第一个正确的答案。这个答案也是错误的,因为它给出了数据类型对象的列,而不是整数。我认为你的答案非常好。你可以试着在问题下方为Kelly Moran添加评论,也许她会改为接受你的答案。但这取决于她。我很抱歉,我弄错了时间戳,没有意识到你是第一个回应的。我已经接受了你的回答。
import pandas as pd
import io

temp=u"""A,,B,,C,
a1,a2,b1,b2,c1,c2
1,1,1,1,1,1
2,2,2,2,2,2"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), sep=",", index_col=None, header=None)
print df
#    0    1   2    3   4    5
#0   A  NaN   B  NaN   C  NaN
#1  a1   a2  b1   b2  c1   c2
#2   1    1   1    1   1    1
#3   2    2   2    2   2    2

df.ix[0,:] = df.ix[0,:].fillna(method='ffill')
print df
#    0   1   2   3   4   5
#0   A   A   B   B   C   C
#1  a1  a2  b1  b2  c1  c2
#2   1   1   1   1   1   1
#3   2   2   2   2   2   2

print zip(df.ix[0,:], df.ix[1,:])
#[('A', 'a1'), ('A', 'a2'), ('B', 'b1'), ('B', 'b2'), ('C', 'c1'), ('C', 'c2')]

df.columns = pd.MultiIndex.from_tuples(zip(df.ix[0,:], df.ix[1,:]))
df = df.ix[2:].reset_index(drop=True)

print df
#   A     B     C   
#  a1 a2 b1 b2 c1 c2
#0  1  1  1  1  1  1
#1  2  2  2  2  2  2