添加两个具有不同尺寸的矩阵,标签并在总和矩阵中保留标签

时间:2016-11-23 23:08:24

标签: python pandas numpy matrix scipy

我有两个方形矩阵作为两个csv文件。每个矩阵都有一个行和列标签。每行,列标签检测两家公司之间的关系分数。 两个游艇都有一些标签(公司)在另一个中缺失。而且,两个矩阵的尺寸都不同。 (一个是427 x 427,另一个是467 x 467)

例如:在下面的矩阵中,粗体数字是标签(公司序列号)。

0 is the score between (10010, 10010) . 
0.43967 is the score between (1013, 10010) and so on. 

enter image description here

我需要以下列方式添加这两个矩阵: 在得到的矩阵(两个矩阵的总和)中,没有标签(行或列标签)丢失。 如果标签存在于A而不存在于B中,则生成的矩阵应该有一行& B列的条目(标签和值),反之亦然。

Example: 
Note that {a, b ... e} are labels. X & Y are matrices. 
       a   b   c   d               a   e
    a   1.2 1.3 1.4 1.5         a   9.1 9.2
X=  b   2.1 2.2 2.3 2.4     Y=  e   8.1 8.2
    c   3.3 3.4 3.5 3.6                 
    d   4.2 4.3 4.4 4.5                 

            a       b       c       d       e
        a   1.2+9.1 1.3     1.4     1.5     9.2
X+Y=    b   2.1     2.2     2.3     2.4     0
        c   3.3     3.4     3.5     3.6     0
        d   4.2     4.3     4.4     4.5     0
        e   8.1     0       0       0       8.2

我发布了一个similar question,但给出的答案没有考虑行标签,并使得到的矩阵呈矩形。 生成的矩阵也必须是正方形

我迷失了如何在python / pandas或任何其他python库中完成此操作。有人可以帮我弄这个吗?

矩阵文件为here

1 个答案:

答案 0 :(得分:1)

假设列和索引标签是相同的值,如果你取出列的并集并重新索引两个dfs并在添加之前用NaN填充0那么你得到结果你欲望。

如果列和索引标签不相同,则可以只生成组合标签的2个数组:

all_cols = x.columns | y.columns
all_indices = x.index | y.index

reindex

使用您的示例数据:

In [11]:
all_cols = x.columns | y.columns
x = x.reindex(index=all_cols, columns=all_cols).fillna(0)
y = y.reindex(index=all_cols, columns=all_cols).fillna(0)
x+y

Out[11]:
      a    b    c    d    e
a  10.3  1.3  1.4  1.5  9.2
b   2.1  2.2  2.3  2.4  0.0
c   3.3  3.4  3.5  3.6  0.0
d   4.2  4.3  4.4  4.5  0.0
e   8.1  0.0  0.0  0.0  8.2

实际上,您只能reindex add的结果:

In [13]:
x.add(y, fill_value=0).reindex(index=all_cols,columns=all_cols).fillna(0)

Out[13]:
      a    b    c    d    e
a  10.3  1.3  1.4  1.5  9.2
b   2.1  2.2  2.3  2.4  0.0
c   3.3  3.4  3.5  3.6  0.0
d   4.2  4.3  4.4  4.5  0.0
e   8.1  0.0  0.0  0.0  8.2

修改

关于您的真实数据,您需要指定第一个未命名的列是索引:

X= pd.read_csv('30203_Transpose.csv', index_col=0)
Y= pd.read_csv('62599_1999psCSV.csv', index_col=0)

此外,您的索引与列不同,因此需要单独汇总

all_cols = X.columns | Y.columns
all_indices = X.index | Y.index

然后你可以add

X.add(Y, fill_value=0).reindex(index=all_cols,columns=all_cols).fillna(0)