从缺少值的Python嵌套字典构建表

从缺少值的Python嵌套字典构建表,python,dictionary,tabular,Python,Dictionary,Tabular,以下是我目前拥有的数据结构: {'bin1': {'A': 14545, 'B': 18579, 'C': 5880, 'D': 20771, 'E': 404396}, 'bin2': {'A': 13200, 'B': 12279, 'C': 5000, 'D': 16766, 'E': 200344}, [...] } 我想写

以下是我目前拥有的数据结构:

{'bin1': {'A': 14545,
          'B': 18579,
          'C': 5880,
          'D': 20771,
          'E': 404396},
 'bin2': {'A': 13200,
          'B': 12279,
          'C': 5000,
          'D': 16766,
          'E': 200344},
 [...] }
我想写一张表格,形式如下:

        A     B     C    D     E    
bin1  14545 18579 5880 20771 494396
bin2  13200 12279 5000 16766 200344
...
目前我正在使用一个粗略的打印循环(其中d==上面描述的字典):

这似乎有效(尽管明显无序),但在我的输出中,我发现一些嵌套字典不包含所有字段A-E。我想一种方法是重建字典,可能使用更合适的矩阵类型数据结构,并用
0
填充缺少的值,但是考虑到我手头有这么大的嵌套字典,有没有更聪明的方法来打印上面显示的输出,以处理缺少的元素呢?

您可以使用
d[j].get(q,'0')
而不是
d[j][q]
来填充所有缺少的条目:

# print the table header
labs = sorted(max(d.values(), key=len))
print "bin" + "\t" + "\t".join(labs)

# loop and print the values
for j in d:
    print j + "\t" + "\t".join(str(d[j].get(q, '0')) for q in labs)
我还对代码的其他部分做了一些细微的修改,以便对列进行排序。

使用:

印刷品

          A      B     C      D       E
bin1  14545  18579  5880  20771  404396
bin2  13200      0     0  16766  200344

df.fillna(0)
将缺少的值替换为0。

他可以使用
dict.get()
,而无需创建临时
defaultdict
j+“\t”+“\t”。join(str(d[j].get(q.),用于实验室中的q)
get
的默认值不应该是整数
0
而不是字符串
'0'
?不管怎样,它被转换为字符串都会起作用,但是将其设置为
'0'
开始时应该会稍微快一点。如果
d.values()
返回的第一个字典不完整(缺少键值对)这不会导致缺少列吗?我错过了后来转换为字符串的过程。
import pandas as pd

data = {'bin1': {'A': 14545,
          'B': 18579,
          'C': 5880,
          'D': 20771,
          'E': 404396},
        'bin2': {'A': 13200,
          'D': 16766,
          'E': 200344},
        }

df = pd.DataFrame(data).T
df.fillna(0, inplace=True)
print(df)
          A      B     C      D       E
bin1  14545  18579  5880  20771  404396
bin2  13200      0     0  16766  200344