Python 如何将Pandas中的非零条目转换为dict with list?

Python 如何将Pandas中的非零条目转换为dict with list?,python,pandas,Python,Pandas,假设现在我有一个面具 mask=df.DataFrame([[0,0,1],[1,1,0],[0,0,1]] 实际上,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]) 即 我只想保留mask中带有“true”的score条目,即结果应为 0 1 2 0 0

假设现在我有一个面具

mask=df.DataFrame([[0,0,1],[1,1,0],[0,0,1]]
实际上,
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])

我只想保留
mask
中带有“true”的
score
条目,即结果应为

    0    1    2
0   0    0    0.2
1   0.1  0.9  0
2   0    0    0.8
最后,我需要使用如下列表将结果转换为dict

result = {0: {2: 0.2}, 1: {0: 0.1, 1: 0.9}, 2: {2: 0.8}}
我怎么能用蟒蛇的方式来做呢?谢谢大家!

用于将
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}}
另一个想法是将不匹配的值改形并替换为
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}}
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}}