Skip to main content
 首页 » 编程设计

python之Pandas 在多级数据框上应用 map

2024年10月17日37zhujiabin

我有一个方阵作为 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