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
我在 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