问题陈述:
我有各种想要对称的 Pandas 数据框。有时行索引标签的数量会超过列标签的数量,反之亦然。在任何一种情况下,结果数据帧的行和列标签都应该是所有标签的排序联合。任何缺失的数据都将用 np.nan
填充。
我的解决方案有效,但它涉及制作数据框的 3 个副本:原始 df、填充了 col 标签的 df 和填充了行标签的 df。我尝试过的任何其他解决方案都会导致不完全对称的矩阵。我正在寻求帮助,使我的解决方案更简单,更“pythonic”。
设置非对称数据框:
asym = pd.DataFrame.from_dict(
{'row': ['a','b','c','x','y','z','!'],
'a': [ n, -.8,-.6,-.3, .8, .01,n],
'b': [-.8, n, .5, .7,-.9, .01,n],
'c': [-.6, .5, n, .3, .1, .01,n],
'q': [-.3, .7, .3, n, .2, .01,n],
'r': [ .8,-.9, .1, .2, n, .01,n],
's': [ .01, .01, .01, .01, .01, n,n],
}).set_index('row')
非对称数据框:
请注意,列标签缺少
"x","y","z","!"
,行标签缺少 "q","r","s"
。尝试对称:
df = asym
c = df.columns
r = df.index
label_union = set(c).union(set(r))
# fill rows with unique labels
df_1 = df.reindex(index=label_union.difference(r).union(set(r)), fill_value=n)
# fill cols with unique labels
df_2 = df_1.reindex(columns=label_union.difference(c).union(set(c)), fill_value=n)
# sort labels
df_2.sort_index(axis=0, inplace=True)
df_2.sort_index(axis=1, inplace=True)
下面的结果是正确的,但制作三个 df 副本似乎不合逻辑。我还想“就地”执行上面的代码,因为我使用的数据框很大而且很多。帮我找到一个解决方案,在没有所有 df 副本的情况下给出正确的结果。
对称数据框:
使用“对称”的注意事项:
这个结果数据帧不是严格对称的,这意味着这个矩阵不等于它的转置。我使用“对称”来专门指代行和列标签。这个玩具示例的矩阵模拟了一个遗传相互作用矩阵,其中行和列是基因,相应的值是描述该相互作用的分数。为了真正对称,矩阵将意味着传递性,这在遗传相互作用中通常不是这种情况。
最佳答案
您可以使用 reindex
同时重新索引两个轴:
label_union = asym.index.union(asym.columns)
asym = asym.reindex(index=label_union, columns=label_union)
结果输出:
! a b c q r s x y z
! NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
a NaN NaN -0.80 -0.60 -0.30 0.80 0.01 NaN NaN NaN
b NaN -0.80 NaN 0.50 0.70 -0.90 0.01 NaN NaN NaN
c NaN -0.60 0.50 NaN 0.30 0.10 0.01 NaN NaN NaN
q NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
r NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
s NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
x NaN -0.30 0.70 0.30 NaN 0.20 0.01 NaN NaN NaN
y NaN 0.80 -0.90 0.10 0.20 NaN 0.01 NaN NaN NaN
z NaN 0.01 0.01 0.01 0.01 0.01 NaN NaN NaN NaN
关于python - 具有对称列和索引(行)标签的 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41945953/