我有两个方阵作为两个 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.
我需要将这两个矩阵相加: 在生成的矩阵(两个矩阵的和)中,没有丢失标签(行或列标签)。 如果标签存在于 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/