python - 将两个具有不同维度、标签的矩阵相加并在总和矩阵中保留标签

标签 python pandas numpy matrix scipy

我有两个方阵作为两个 csv 文件。每个矩阵都有行和列标签。每行、列标签检测两家公司之间的关系得分。 两个marices都有一些标签(公司),而另一个则没有。此外,两个矩阵的维数也不同。 (一个是 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 中,则生成的矩阵应具有其行和列条目(标签和值),反之亦然。

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

最佳答案

假设列和索引标签是相同的值,如果您采用列的并集并重新索引两个 dfs,并在添加之前用 0 填充 NaN然后你就得到了你想要的结果。

如果列标签和索引标签不同,您可以创建 2 个组合标签数组:

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

重新索引

使用您的示例数据:

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

实际上,您可以重新索引 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

然后您可以添加:

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

关于python - 将两个具有不同维度、标签的矩阵相加并在总和矩阵中保留标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40775626/

相关文章:

python - 逻辑 AND 数据帧在一起

python - 将切片组合成多维切片以进行 numpy 数组切片

python - scipy.sparse 中缺少 save_npz 方法

python - 如何按周和年绘制时间序列数据?

python - 如何合并两个具有不同日期时间索引的 Pandas 时间序列对象?

pandas - 如何根据前几年计算变化百分比,其中第一年为 0

python - 如何解决 Numpy 找不到模块错误?

python - Pandas 将过滤后的行附加到另一个 DataFrame

python - 基于置信区间值的误差带等高线图

python - 不使用 collection.deque 旋转列表