问题陈述:

我有各种想要对称的 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')

非对称数据框:

python - 具有对称列和索引(行)标签的 Pandas 数据框-LMLPHP

请注意,列标签缺少 "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 副本的情况下给出正确的结果。

对称数据框:

python - 具有对称列和索引(行)标签的 Pandas 数据框-LMLPHP

使用“对称”的注意事项:
这个结果数据帧不是严格对称的,这意味着这个矩阵不等于它的转置。我使用“对称”来专门指代行和列标签。这个玩具示例的矩阵模拟了一个遗传相互作用矩阵,其中行和列是基因,相应的值是描述该相互作用的分数。为了真正对称,矩阵将意味着传递性,这在遗传相互作用中通常不是这种情况。

最佳答案

您可以使用 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/

10-15 08:51