2016-06-21 3 views
2

팬더의 데이터 프레임으로 사각형 매트릭스가 있습니다. 그것은 대칭이어야하며 거의 0입니다. 누락 된 값을 채우기 위해 대칭이어야한다는 사실을 df.ix에 대한 절대 값의 최대 값을 취하여 사용합니다. [x, y] 및 df.ix [y, x]. 즉 :다중 레벨 데이터 프레임의 팬다 applymap

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

는 처음에는이 같은 기능 뭔가 간단한 applymap를 사용하여 생각 :

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 

는이되어야

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'중 하나에서 (사용 가능한 경우 0이 아닌)

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 

지금 내가 올바른을 추출 할 요소 :

그래서 그때 멀티 레벨 원래 행렬의 dataframe과 그 전치을 시도 , 각 요소에 대해 위와 유사한 함수를 사용합니다. 하지만 다중 색인화에 익숙하지 않은 나는 여기에서 applymap을 사용하는 방법을 알아낼 수 없거나 다른 것을 사용해야하는 경우를 알 수 없다.

제안 사항? 코멘트에 의해

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 

편집 :

답변

2

내가 먼저, numpy arraydf 변환 numpy solution을 사용하고 DataFrameconstructor로 만들 지속될 수 있다고 생각

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]. filena (0) 답을 편집하려면 받아 들일 것입니다 :) – andbeonetraveler

+0

나는 당신의 제안을 덧붙인다. 그러나 출력은 조금 다르다. 괜찮 니? – jezrael

+0

그래, 내가 원하는 건 그게 염려된다. 기본적으로 numpy로 변환하지 않고 기본적으로 같은 생각이다. 문제가 발생하면 항상 dtypes를 수동으로 변경할 수 있습니다. 감사! 원래 게시물에 대한 변경 사항을 반영하기 위해 편집했습니다. – andbeonetraveler