繁体   English   中英

将嵌套字典转换为CSV表

[英]Convert Nested Dictionary to CSV Table

我正在阅读数据挖掘教程,并且正在使用以下词典。

users = {
    "Angelica": {
        "Blues Traveler": 3.5, 
        "Broken Bells": 2.0, 
        "Norah Jones": 4.5, 
        "Phoenix": 5.0, 
        "Slightly Stoopid": 1.5, 
        "The Strokes": 2.5, 
        "Vampire Weekend": 2.0
    },         
    "Bill":{
        "Blues Traveler": 2.0, 
        "Broken Bells": 3.5, 
        "Deadmau5": 4.0, 
        "Phoenix": 2.0, 
        "Slightly Stoopid": 3.5, 
        "Vampire Weekend": 3.0
    },
    "Chan": {
        "Blues Traveler": 5.0, 
        "Broken Bells": 1.0, 
        "Deadmau5": 1.0, 
        "Norah Jones": 3.0, 
        "Phoenix": 5, 
        "Slightly Stoopid": 1.0
    },
    "Dan": {
        "Blues Traveler": 3.0, 
        "Broken Bells": 4.0, 
        "Deadmau5": 4.5, 
        "Phoenix": 3.0, 
        "Slightly Stoopid": 4.5, 
        "The Strokes": 4.0, 
        "Vampire Weekend": 2.0
    },
    "Hailey": {
        "Broken Bells": 4.0, 
        "Deadmau5": 1.0, 
        "Norah Jones": 4.0, 
        "The Strokes": 4.0, 
        "Vampire Weekend": 1.0
    },
    "Jordyn":  {
        "Broken Bells": 4.5, 
        "Deadmau5": 4.0, 
        "Norah Jones": 5.0, 
        "Phoenix": 5.0, 
        "Slightly Stoopid": 4.5, 
        "The Strokes": 4.0, 
        "Vampire Weekend": 4.0
    },
    "Sam": {
        "Blues Traveler": 5.0, 
        "Broken Bells": 2.0, 
        "Norah Jones": 3.0, 
        "Phoenix": 5.0, 
        "Slightly Stoopid": 4.0, 
        "The Strokes": 5.0
    },
    "Veronica": {
        "Blues Traveler": 3.0, 
        "Norah Jones": 5.0, 
        "Phoenix": 4.0, 
        "Slightly Stoopid": 2.5, 
        "The Strokes": 3.0
    }
}

我想将其转换为.csv文件,以便在Excel中打开该文件时,会得到一个表格,其中的歌曲位于行侧,名称位于列侧: 表格以等级作为数值

是否有任何内置的python方法可以帮助我实现这一目标?

您必须将包含行的列转置为包含列的行。 在这里使用collections.defaultdict()对象是最简单的:

rows = defaultdict(dict)

for user, artists in users.iteritems():
    for artist, count in artists.iteritems():
        rows[artist][user] = count

现在,您有了可以直接写入csv.DictWriter()字典:

with open(csvfilename, 'wb') as outf:
    writer = csv.DictWriter(outf, [''] + users.keys())
    writer.writeheader()
    writer.writerows(dict(row, **{'': key}) for key, row in rows.iteritems()) 

需要生成器表达式为rows字典中的每个值添加添加的第一列键值对。

演示:

>>> from collections import defaultdict
>>> import csv
>>> users = { ... }  # elided for brevity
>>> rows = defaultdict(dict)
>>> for user, artists in users.iteritems():
...     for artist, count in artists.iteritems():
...         rows[artist][user] = count
... 
>>> import sys
>>> writer = csv.DictWriter(sys.stdout, [''] + users.keys())
>>> writer.writeheader()
,Angelica,Veronica,Sam,Jordyn,Dan,Bill,Chan,Hailey
>>> writer.writerows(dict(row, **{'': key}) for key, row in rows.iteritems()) 
The Strokes,2.5,3.0,5.0,4.0,4.0,,,4.0
Blues Traveler,3.5,3.0,5.0,,3.0,2.0,5.0,
Phoenix,5.0,4.0,5.0,5.0,3.0,2.0,5,
Broken Bells,2.0,,2.0,4.5,4.0,3.5,1.0,4.0
Deadmau5,,,,4.0,4.5,4.0,1.0,1.0
Norah Jones,4.5,5.0,3.0,5.0,,,3.0,4.0
Slightly Stoopid,1.5,2.5,4.0,4.5,4.5,3.5,1.0,
Vampire Weekend,2.0,,,4.0,2.0,3.0,,1.0

尝试这个

import csv
# Create header line
a = ["Album/Track"] + users.keys()

# Create unique keys.
x = list(set([y for z in users.values() for y in z.keys()]))

# Create rows
rows = [a]+[[q]+[users[p].get(q, '-') for p in a[1:]] for q in x]

with open('my.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile)
    for row in rows:
        writer.write(row)
import pandas as pd
data = pd.DataFrame(users)
data = data.fillna("-")
data.to_csv("./users.csv")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM