2016-03-11 89 views
3

我有一个csv,它是以我无法更改的格式生成的。该文件具有多索引。该文件看起来像这样。Multiindex只有大熊猫的一些列

enter image description here

最终目标是把顶行(小时)成一个索引,以及与“ID”列索引它,使得数据看起来像这样。

enter image description here

我已经导入的文件变成熊猫......

myfile = 'c:/temp/myfile.csv' 
df = pd.read_csv(myfile, header=[0, 1], tupleize_cols=True) 
pd.set_option('display.multi_sparse', False) 
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['hour', 'field']) 
df 

但是,这给了我三个无名领域:

enter image description here

我的最后一步是堆在小时:

df.stack(level=['hour']) 

但我错过了之前发生的事情,我可以在其中索引其他列,即使上面有一个空白的多索引行。

回答

4

我相信你缺少的行可能是3号和4:

df = pd.io.parsers.read_csv('temp.csv', header = [0,1], tupleize_cols = True) 
df.columns = [c for _, c in df.columns[:3]] + [c for c in df.columns[3:]] 
df = df.set_index(list(df.columns[:3]), append = True) 
df.columns = pd.MultiIndex.from_tuples(df.columns, names = ['hour', 'field']) 
  1. 通过降低第一个值的第一个3山坳转换的元组字符串。头。
  2. 通过将这些标题放置在索引中来收集这些标题。

执行stack之后,您可以根据需要重置索引。

例如

之前

(Unnamed: 0_level_0, Date) (Unnamed: 1_level_0, id) \ 
0     3/11/2016       5 
1     3/11/2016       6 

    (Unnamed: 2_level_0, zone) (100, p1) (100, p2) (200, p1) (200, p2) 
0      abc  0.678  0.787  0.337  0.979 
1      abc  0.953  0.559  0.776  0.520 

field      p1  p2 
    Date  id zone hour    
0 3/11/2016 5 abc 100 0.678 0.787 
        200 0.337 0.979 
1 3/11/2016 6 abc 100 0.953 0.559 
        200 0.776 0.520 
+0

太感谢了,Yakym。 –

+0

我很高兴我能提供帮助。 –