2016-09-23 151 views
1

在我的工作流程中的某個時刻,我最終得到了一個帶有一些列和一些行的常規熊貓數據框。我想使用df.to_latex()將此DataFrame導出到乳膠表中。這很好,但是,我知道要使用多列,其中一些列是多表的一部分。例如,一個DataFrame的列a,b,c,d,e我想離開列a,但是將b和c,以及d和e組合起來。將一些DataFrame列重新索引到多索引

import numpy as np 
import pandas as pd 

# where I am 
data = np.arange(15).reshape(3, 5) 
df = pd.DataFrame(data=data, columns=['a', 'b', 'c', 'd', 'e']) 

它看起來像這樣:

In [161]: df 
Out[161]: 
    a b c d e 
0 0 1 2 3 4 
1 5 6 7 8 9 
2 10 11 12 13 14 

我想組列B和C,以及d和e,但留下一個孤單。所以我希望的輸出應該是這樣的。

# where I want to be: leave column 'a' alone, group b&c as well as d&e 
multi_index = pd.MultiIndex.from_tuples([ 
    ('a', ''), 
    ('bc', 'b'), 
    ('bc', 'c'), 
    ('de', 'd'), 
    ('de', 'e'), 
]) 
desired = pd.DataFrame(data, columns=multi_index) 

它看起來像這樣:

In [162]: desired 
Out[162]: 
    a bc  de  
     b c d e 
0 0 1 2 3 4 
1 5 6 7 8 9 
2 10 11 12 13 14 

爲了到那裏,我想簡單的重新索引。這給了我想要的形狀,但所有列只有NaN的價值。

# how can use df and my multiindexreindex to multi column DataFrame 
result = df.reindex(columns=multi_index) 

結果看起來像描述,正確的指標,但所有NaN

In [166]: result 
Out[166]: 
    a bc  de  
     b c e e 
0 NaN NaN NaN NaN NaN 
1 NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN 

我怎樣才能得到我想要的結果?

+1

'reindex'將無法正常工作。它採用當前幀和當前索引,並按照新索引按照傳遞索引的順序排列索引。它不會從單個索引到多索引神奇地對齊。你得到所有的NaN,因爲原始幀中的位置'[0,(a,None)]'或'[0,(bc,b)]'(等​​)處沒有數據。我不明白'pd.DataFrame(data,columns = multi_index)'有什麼問題。如果沒有,總會有一個古老的'groupby'... – Kartik

+0

@Kartik TY輸入。我不能簡單地做''pd.DataFrame(data,columns = multi_index)'',因爲我只有''df'',而不是''data''本身。這只是代碼來顯示想要的結果,我想要去的地方。 – Nras

回答

1

您可以分配多指標直接在數據幀的列屬性:

df.columns = multi_index 
df 

enter image description here

+0

令人難以置信...謝謝你,我確信它必須是這樣簡單的事情。請問,您是如何創建DataFrame的這種表示形式的? – Nras

+0

你的意思是屏幕截圖?在提問時通常最好不要使用圖像,因爲這會使答案生成數據框變得困難。 – Psidom

1
pd.concat([df.set_index('a')[['b', 'c']], 
      df.set_index('a')[['d', 'e']]], 
      axis=1, keys=['bc', 'de']).reset_index(col_level=1) 

enter image description here

+0

這幾乎是正確的,它確實把一個分層次。不過,我也可以處理這個問題。 – Nras

+0

@Nras很有趣,我可以發誓,我在子級看到了'a',這就是爲什麼我用'col_level = 1'放到那裏的原因。刪除該參數以將其放在需要的位置。 – piRSquared

+0

其實你可能是對的:) – Nras