我有两个方形矩阵作为两个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.
我需要以下列方式添加这两个矩阵: 在得到的矩阵(两个矩阵的总和)中,没有标签(行或列标签)丢失。 如果标签存在于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。
答案 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)