【问题标题】:Convert Nested Dictionary to CSV Table将嵌套字典转换为 CSV 表
【发布时间】:2014-09-16 23:07:17
【问题描述】:

我正在通过tutorial 进行数据挖掘,并且正在使用以下字典。

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 方法可以帮助我实现这一目标?

【问题讨论】:

标签: python python-2.7 csv dictionary


【解决方案1】:

试试这个

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() object 是最简单的:

    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
    

    【讨论】:

      【解决方案3】:
      import pandas as pd
      data = pd.DataFrame(users)
      data = data.fillna("-")
      data.to_csv("./users.csv")
      

      【讨论】:

      • 很好,但用户要求“内置 python 方法”。考虑到这一点,如果您简要描述 Pandas 库是什么,提供指向它的链接,以及一些简短描述和您使用的函数和类的文档链接,您的答案会好得多。
      • 寻找类似的东西,不是内置的很好,这是完美的。
      猜你喜欢
      • 2020-09-03
      • 1970-01-01
      • 2022-12-05
      • 2017-07-29
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多