2016-10-24 52 views
14

讓說我有一個數據幀,看起來像這樣:如何簡單地一列級添加到大熊貓數據幀

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)}) 
df 
Out[92]: 
    A B 
a 0 0 
b 1 1 
c 2 2 
d 3 3 
e 4 4 

Asumming這個數據幀已經存在,我怎麼能簡單的一個「C」級增加列索引,所以我得到這樣的:

df 
Out[92]: 
    A B 
    C C 
a 0 0 
b 1 1 
c 2 2 
d 3 3 
e 4 4 

見到這麼anwser這樣python/pandas: how to combine two dataframes into one with hierarchical column index?但這CONCAT不同的數據幀,而不是添加一列水平已經存在的數據幀。

-

回答

14

至於建議的@StevenG自己,一個更好的答案:

df.columns = pd.MultiIndex.from_product([df.columns, ['C']]) 

print(df) 
# A B 
# C C 
# a 0 0 
# b 1 1 
# c 2 2 
# d 3 3 
# e 4 4 
+0

這是偉大的,我喜歡'pd.MultiIndex.from_product([df.columns, ['C']])'這是一個更瑣碎的小事,因爲你不必跟蹤'df.columns'的'len'。你介意把它添加到答案中,以便我可以接受它? –

+0

@StevenG太棒了我不知道這個把戲。謝謝我學到了一些新東西:-) – Romain

+3

當原始df已經有多索引列名時,您是否有任何提示,如何添加另一個關卡?我試圖用from_product()方法添加新的級別,但是我收到了以下錯誤消息:'NotImplementedError:isnull沒有爲MultiIndex定義'。 –

6

選項1
​​和T

df.T.set_index(np.repeat('C', df.shape[1]), append=True).T 

選項2
pd.concatkeys,並swaplevel

pd.concat([df], axis=1, keys=['C']).swaplevel(0, 1, 1) 

enter image description here

+0

謝謝你不知道交換,這是方便的。我測試了它的一個大數據框,看看它是否比設置'pd.MultiIndex.from_product([df.columns,['C']])'更有效,並且速度慢了大約25%。 –

+0

沒有驚喜!羅曼的答案更快。我加了這個,因爲我認爲這很有價值。 – piRSquared

+0

'pd.concat([df],axis = 1,keys = ['C'])'對於多級列非常適用 –