Pandas 在多级数据框上应用地图

Pandas applymap on multilevel dataframe

我在 pandas 中有一个方阵作为数据框。它应该是对称的,几乎是对称的,除了我用 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)。

然后我尝试制作原始矩阵及其转置的多级数据框:

    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

现在我想从 'o' 或 't' 中为每个元素提取正确的(非零,如果可用)元素,使用与上述类似的函数。但是我对多索引不是很有经验,我不知道如何在这里使用 applymap,或者我是否应该使用其他东西。

建议?

我认为您可以先将 df 转换为 numpy array,然后使用 numpy solution,最后使用 constructor:

创建 DataFrame
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