Pandas在多级数据帧上应用map

时间:2016-06-21 21:29:53

标签: python pandas multi-level

我在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,或者我是否应该使用其他东西。

建议?

1 个答案:

答案 0 :(得分:2)

我认为您可以先将.html转换为df,然后使用numpy solution,最后使用numpy array创建DataFrame

constructor

通过评论编辑:

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