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,或者如果我應該使用別的東西。
對此提出建議?
對不起,我應該澄清,大部分的值已經對稱了(我編輯了帖子,以便(a,c)涵蓋這種情況)。但是,根據你的建議,我認爲這將起作用:df + df.T - df [df == df.T] .fillna(0) 如果你想編輯你的答案,我會接受它:) – andbeonetraveler
我添加了你的建議,但是輸出結果有點不同。可以嗎? – jezrael
是的,據我所知,這是做我想要的 - 基本上是一樣的想法,沒有先轉換成numpy。如果出現問題,可以隨時手動更改dtypes。謝謝! 雖然我編輯它,以反映我對原始帖子所做的更改。 – andbeonetraveler