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