numpy Pandas操作从一个矩阵中获得矩阵

hs1ihplo  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我对python相当陌生,对pandas也很陌生。我试图做一个矩阵运算,我有一个名为sample_df的矩阵,看起来像这样:

Set1    Set2  %overlap  %unique for Set1  %unique for Set2
0    S 077  S2 077    98.790              0.01              0.02
1    S 080  S2 080    99.165              0.01              0.01
2    S 023  S2 023    98.490              0.01              0.02
3    S 080  S2 115    97.760              0.02              0.03

字符串
Set1和Set2各有3个值。
我正在尝试创建一个5x5矩阵,该矩阵以Set2的值作为列名
列1正下方的额外行需要包含与“Set 2”中的每个值对应的“Set 2的%unique”值。类似地,“Set 1”的每个值旁边的额外列需要包含"Set 1的%unique“的相应值。矩阵的其余部分对角填充”% overlap“中的相应值。
结果的df需要看起来像这样:

S2 077    S2 080     S2 030      S2 115
                 0.02      0.01       0.02        0.03
S 077    0.01    98.790              
S 080    0.01              99.165     
S 023    0.01                         98.490
S 080    0.02                                     97.760


到目前为止,我通过旋转sample_df创建了一个新的框架:
sub_df = sample_df.pivot(index='Set1', columns='Set2', values='%overlap')
但这给了我一个“S 080”只出现一次的框架,并且在同一行中有两个值,分别是“S2 080”和“S2 115”,我希望它们在不同的行中。
我可以在矩阵中插入一个空的行和列,但是我不知道如何填充值,因为我不认为我可以使用sub_df.pivot来完成这个任务(或者我没有正确使用它)。

hc2pp10m

hc2pp10m1#

按照MultiIndex.from_frame创建的原始顺序将DataFrame.pivotDataFrame.reindex一起使用:

cols1 = ['Set1','%unique for Set1']
cols2 = ['Set2','%unique for Set2']
mux1 = pd.MultiIndex.from_frame(sample_df[cols1], names=(None, None))
mux2 = pd.MultiIndex.from_frame(sample_df[cols2], names=(None, None))

out = (sample_df.pivot(index=cols1,
                      columns=cols2, 
                      values='%overlap')
                .reindex(index=mux1, columns=mux2))
print (out)
           S2 077  S2 080 S2 023 S2 115
             0.02    0.01   0.02   0.03
S 077 0.01  98.79     NaN    NaN    NaN
S 080 0.01    NaN  99.165    NaN    NaN
S 023 0.01    NaN     NaN  98.49    NaN
S 080 0.02    NaN     NaN    NaN  97.76

字符串
或者使用DataFrame构造函数,填充Series的对角线:

cols1 = ['Set1','%unique for Set1']
cols2 = ['Set2','%unique for Set2']
mux1 = pd.MultiIndex.from_frame(sample_df[cols1], names=(None, None))
mux2 = pd.MultiIndex.from_frame(sample_df[cols2], names=(None, None))

mat = np.full((sample_df.shape[0], sample_df.shape[0]), np.nan)
np.fill_diagonal(mat, sample_df['%overlap'])

out = pd.DataFrame(mat, index=mux1, columns=mux2)
print (out)
           S2 077  S2 080 S2 023 S2 115
             0.02    0.01   0.02   0.03
S 077 0.01  98.79     NaN    NaN    NaN
S 080 0.01    NaN  99.165    NaN    NaN
S 023 0.01    NaN     NaN  98.49    NaN
S 080 0.02    NaN     NaN    NaN  97.76

相关问题