Python 当跨列标题为';时,如何将csv文件作为多索引数据帧读入;没有重复吗?
我有许多.csv文件,我想作为多索引数据帧读入,但跨列标题不会重复,因此我只剩下两个标题,而不是多索引 test.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:
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