如何将Pandas中的非零条目转换为带列表的字典?

时间:2019-04-14 12:16:28

标签: python pandas

假设我现在有口罩

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的方式做?谢谢!

1 个答案:

答案 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}}