假设我现在有口罩
mask = df.DataFrame([[0, 0, 1], [1, 1, 0], [0, 0, 1]])
Actullay,mask
是
0 1 2
0 0 0 1
1 1 1 0
2 0 0 1
此外,我有一个得分矩阵,例如
score = df.DataFrame([[0.5, 0.3, 0.2], [0.1, 0.9, 0.7], [0.5, 0.4, 0.8]])
即
0 1 2
0 0.5 0.3 0.2
1 0.1 0.9 0.7
2 0.5 0.4 0.8
我只想在score
中保留mask
中带有“ true”的条目,即结果应该是
0 1 2
0 0 0 0.2
1 0.1 0.9 0
2 0 0 0.8
最后,我需要将结果转换为列表类似的
result = {0: {2: 0.2}, 1: {0: 0.1, 1: 0.9}, 2: {2: 0.8}}
我该如何用Python的方式做?谢谢!
答案 0 :(得分:1)
使用DataFrame.where
和铸造0,1
掩码来布尔化:
print (score.where(mask.astype(bool), 0))
0 1 2
0 0.0 0.0 0.2
1 0.1 0.9 0.0
2 0.0 0.0 0.8
然后转换为字典并删除嵌套字典中的0
值:
d = score.where(mask.astype(bool), 0).to_dict(orient='index')
d = {k:{k1:v1 for k1, v1 in v.items() if v1 != 0} for k, v in d.items()}
print (d)
{0: {2: 0.2}, 1: {0: 0.1, 1: 0.9}, 2: {2: 0.8}}
另一种想法是用DataFrame.stack
重塑形状,并将不匹配的值替换为NaN
:
s = score.where(mask.astype(bool)).stack()
d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}
print (d)
{0: {2: 0.2}, 1: {0: 0.1, 1: 0.9}, 2: {2: 0.8}}