Pandas和Dictionary:将Dict转换为DataFrame,并将值中的内部键用作DataFrame列标题

时间:2017-11-06 09:59:32

标签: python pandas dictionary

我有以下字典:

{
 0: [{1: 0.0}, {2: 0.0}, {3: 0.0}, {4: 0.0}, {5: 0.0}, {6: 0.0}, {7: 0.0}, {8: 0.0}], 
 1: [{1: 0.0}, {2: 0.0}, {3: 0.0}, {4: 0.0}, {5: 0.0}, {6: 0.0}, {7: 0.0}, {8: 0.0}], 
 2: [{1: 0.21150571615476177}, {2: 0.20021993193784904}, {3: 0.24673408701244148}, {4: 0.26073319330403394}, {5: 0.0}, {6: 0.27012912297379343}, {7: 0.0}, {8: 0.0}], 
 3: [{1: 0.2786416467397351}, {2: 0.2006495239101905}, {3: 0.21600480247194567}, {4: 0.25724906204967557}, {5: 0.0}, {6: 0.26817162148227375}, {7: 0.0}, {8: 0.0}], 
 4: [{1: 0.2755030949011681}, {2: 0.20315735111595443}, {3: 0.21705903867972787}, {4: 0.2564000954604151}, {5: 0.0}, {6: 0.26903863724054405}, {7: 0.0}, {8: 0.0}], 
 5: [{1: 0.27334751895045045}, {2: 0.2012256178641117}, {3: 0.22266330432504813}, {4: 0.25925509529304697}, {6: 0.27562843736621906}], 
 6: [{1: 0.27739942084587565}, {2: 0.198682325880847}, {3: 0.2169017627591854}, {4: 0.25843774856843105}, {6: 0.26996683786070946}], 
 7: [{1: 0.2726461255684456}, {2: 0.19778567408338052}, {3: 0.2197858176643358}, {4: 0.26053721842016453}, {6: 0.26812789513005875}]
}  

如何将此词典转换为 Pandas DataFrame ,并确保每个值中的内部键是相应行值的列标题?
请注意,在第5,6和7行中,缺少内键5,7和8的值,这意味着我需要以下列方式使用DataFrame:

          1         2         3         4         5         6    7    8
0  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.0  0.0
1  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.0  0.0
2  0.211651  0.202256  0.244509  0.256969  0.000000  0.275521  0.0  0.0
3  0.273670  0.199995  0.222494  0.256303  0.000000  0.275037  0.0  0.0
4  0.280948  0.200235  0.218654  0.256737  0.000000  0.276424  0.0  0.0
5  0.281718  0.197531  0.217461  0.256043       NaN  0.271181  NaN  NaN
6  0.279024  0.200089  0.218020  0.261419       NaN  0.272113  NaN  NaN
7  0.278222  0.203448  0.219254  0.261846       NaN  0.269600  NaN  NaN  

(这些值是任意的,它们无关紧要) 除了我知道使用pd.to_csv()将数据帧输出到CSV文件之外,我没有起点 任何帮助表示赞赏。提前谢谢。
(使用Ubuntu 14.04 32位VM和Python 2.7)

P.S。一个类似的问题没有回答,因为其他用户因为没有正确构建句子而感到困惑。它已被删除 我希望这个问题清楚而准确。

1 个答案:

答案 0 :(得分:1)

concat与列表理解结合使用,然后使用小hack - 所有列的总和按二级,加入所有非NaN列:

df = pd.concat({k: pd.DataFrame(v) for k,v in d.items()}, 1).stack().T.sum(level=1, axis=1)
print (df)
          1         2         3         4    5         6    7    8
0  0.000000  0.000000  0.000000  0.000000  0.0  0.000000  0.0  0.0
1  0.000000  0.000000  0.000000  0.000000  0.0  0.000000  0.0  0.0
2  0.211506  0.200220  0.246734  0.260733  0.0  0.270129  0.0  0.0
3  0.278642  0.200650  0.216005  0.257249  0.0  0.268172  0.0  0.0
4  0.275503  0.203157  0.217059  0.256400  0.0  0.269039  0.0  0.0
5  0.273348  0.201226  0.222663  0.259255  NaN  0.275628  NaN  NaN
6  0.277399  0.198682  0.216902  0.258438  NaN  0.269967  NaN  NaN
7  0.272646  0.197786  0.219786  0.260537  NaN  0.268128  NaN  NaN

详情:

print (pd.concat({k: pd.DataFrame(v) for k,v in d.items()}, 1).stack().T)
          0         1         2         3    4                   5    6    7
          1         2         3         4    5         6         6    7    8
0  0.000000  0.000000  0.000000  0.000000  0.0       NaN  0.000000  0.0  0.0
1  0.000000  0.000000  0.000000  0.000000  0.0       NaN  0.000000  0.0  0.0
2  0.211506  0.200220  0.246734  0.260733  0.0       NaN  0.270129  0.0  0.0
3  0.278642  0.200650  0.216005  0.257249  0.0       NaN  0.268172  0.0  0.0
4  0.275503  0.203157  0.217059  0.256400  0.0       NaN  0.269039  0.0  0.0
5  0.273348  0.201226  0.222663  0.259255  NaN  0.275628       NaN  NaN  NaN
6  0.277399  0.198682  0.216902  0.258438  NaN  0.269967       NaN  NaN  NaN
7  0.272646  0.197786  0.219786  0.260537  NaN  0.268128       NaN  NaN  NaN