将嵌套字典转换为CSV表格
我正在学习数据挖掘的教程,并且我使用了下面这个字典。
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 内置的方法可以帮助我实现这个目标呢?
3 个回答
1
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用某个库时,发现它的某个功能并没有按预期工作。这种情况可能会让人感到困惑,因为我们不知道问题出在哪里。
通常,解决这类问题的第一步是查看文档。文档就像是使用说明书,里面会告诉你如何正确使用这个工具或库。如果文档没有解决你的问题,接下来可以尝试在网上搜索一下,看看其他人是否遇到过类似的问题。
如果你在网上找不到答案,可以考虑在一些技术论坛上提问,比如StackOverflow。在提问时,记得描述清楚你遇到的问题,提供一些相关的代码和错误信息,这样其他人才能更好地帮助你。
总之,遇到问题时,不要着急,先查文档,再搜索,最后再寻求帮助。这样可以提高解决问题的效率。
import pandas as pd
data = pd.DataFrame(users)
data = data.fillna("-")
data.to_csv("./users.csv")
2
试试这个
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)
2
你需要把原本是列的内容转换成行的形式,也就是把行和列互换。这里使用一个叫做 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