2016-06-21 61 views
2

我有一個方形矩陣作爲熊貓的數據框。它應該是對稱的,並且幾乎是,除了少數填充0的缺失值之外。我想使用這樣一個事實,即它應該是對稱的以填充缺失的值,方法是將df.ix上的絕對值的最大值[x,y]和df.ix [y,x]。即:大熊貓在多層次數據框上應用貼圖

df = pd.DataFrame({'b': {'b': 1, 'a': 0,'c':-1}, 'a': {'b': 1, 'a': 1,'c':0},'c':{'c':1,'a':0,'b':0}}) 

>>> df 
    a b c 
a 1 0 1 
b 1 1 0 
c 1 -1 1 

應該變成:

>>> df 
    a b c 
a 1 1 1 
b 1 1 -1 
c 1 -1 1 

起初我想用一個簡單的applymap與功能類似的:

def maxSymmetric(element): 
    if abs(element) > df.T.ix[element.column,element.row]: 
      return element 
    else return df.T.ix[element.column,element.row] 

但似乎沒有成爲一個調用applymap中函數內元素索引的方法(請參閱related)。

於是我試圖使原始矩陣的多級數據幀和它的轉置:從任一「O」或「T」

pd.concat([df,df.T],axis=0,keys=['o','t']) 
    a b c 
o a 1 0 1 
    b 1 1 0 
    c 1 -1 1 
t a 1 1 1 
    b 0 1 -1 
    c 1 0 1 

現在我想提取正確的(非零,如果可用)元件,對於每個元素,使用與上面類似的函數。但是我對multiindexing並不是很有經驗,我不知道如何在這裏使用applymap,或者如果我應該使用別的東西。

對此提出建議?

回答

2

我覺得你可以先轉換dfnumpy array,使用numpy solution和持續創造DataFrameconstructor

a = df.values 
print (pd.DataFrame(data=a + a.T - np.diag(a.diagonal()), 
        columns=df.columns, 
        index=df.index)) 

    a b c 
a 1 1 2 
b 1 1 -1 
c 2 -1 1 

編輯的評論:

print (df + df.T - df[df==df.T].fillna(0)) 
    a b c 
a 1.0 1.0 1.0 
b 1.0 1.0 -1.0 
c 1.0 -1.0 1.0 
+0

對不起,我應該澄清,大部分的值已經對稱了(我編輯了帖子,以便(a,c)涵蓋這種情況)。但是,根據你的建議,我認爲這將起作用:df + df.T - df [df == df.T] .fillna(0) 如果你想編輯你的答案,我會接受它:) – andbeonetraveler

+0

我添加了你的建議,但是輸出結果有點不同。可以嗎? – jezrael

+0

是的,據我所知,這是做我想要的 - 基本上是一樣的想法,沒有先轉換成numpy。如果出現問題,可以隨時手動更改dtypes。謝謝! 雖然我編輯它,以反映我對原始帖子所做的更改。 – andbeonetraveler