2016-03-11 124 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

我很高興我能提供幫助。 –