2014-05-20 24 views
1

我想知道如果我可能會錯過一個簡單的方法來拉入一組列名作爲數據框中的索引。Python Pandas:如何將列設置爲索引?

下面是示例代碼我建立了我目前的(凌亂的)解決方案:

df1 = pd.DataFrame({ 
'A' : ['a1', 'a1', 'a2', 'a3'], 
'B' : ['b1', 'b2', 'b3', 'b4'], 
'D1' : [1,0,0,0], 
'D2' : [0,1,1,0], 
'D3' : [0,0,1,1], 
}) 

df1 = df1.set_index(['A','B']) 
b = df1.unstack().unstack() 
c = b.reset_index() 
c.columns = ['D','B','A','Value'] 
d = c.set_index(['A','B','D']) 
final1 = d.unstack() 

df2 = pd.DataFrame({ 
'A' : ['a1', 'a1', 'a2', 'a3'], 
'B' : ['b1', 'b2', 'b3', 'b4'], 
'D1' : [1,0,0,0], 
'D2' : [0,0,0,0], 
'D3' : [0,0,0,1], 
}) 

df2 = df2.set_index(['A','B']) 
b = df2.unstack().unstack() 
c = b.reset_index() 
c.columns = ['D','B','A','Value'] 
d = c.set_index(['A','B','D']) 
final2 = d.unstack() 

result = (final1*final2).dropna() 

所以只要通過更多的背景,我試圖解決實際問題如下: 我有N個數據幀(例如df1,df2),其中包含1和0,我試圖找到一種方法來使用熊貓基於三維索引將它們全部相乘以便找到它們的交集(即結果)。

爲了做到這一點,我想爲什麼不將數據集轉換成Pandas數據框,然後將索引設置爲3維。然後如上所示,它應該是一個簡單的乘法工作,熊貓將負責其餘的工作。

但是,數據的格式爲df1/df2。因此,上面的代碼突出了我將數據轉換爲帶有3個索引的Pandas數據框的混亂嘗試。所以,再次想知道是否有一種更簡單的方法將一組列名移動到索引中。

謝謝!

回答

1

我認爲你可以把你所有的幀放在一個列表中並減少。他們會每次調整;包括fill_value = 1會傳播與NaN(這是我認爲你想要的)相乘時的值。

In [39]: list_of_dfs = [df1,df2] 

In [40]: reduce(lambda x,y: x.mul(y,fill_value=1), list_of_dfs[1:], list_of_dfs[0]) 
Out[40]: 
     D1 D2 D3 
A B    
a1 b1 1 0 0 
    b2 0 0 0 
a2 b3 0 0 0 
a3 b4 0 0 1 
+0

啊...很酷,謝謝。這是解決問題的更簡潔的方法。出於好奇,如果有人想將一組列轉換爲索引(即代碼中的一小塊代碼),有沒有更好的方法來做到這一點?我不能清楚地說明爲什麼我想要這樣做的具體例子,但感覺這可能是一個有用的知識點。 – slee

+0

''df.T.set_index(.....)。T''是成語(直到我們允許一個軸參數到''set_index'') – Jeff

+0

明白了。謝謝。 – slee

相關問題