在python中将多个JSON文件中的信息提取到单个CSV文件

时间:2016-08-22 18:33:31

标签: python json python-2.7 csv pandas

我有一个包含多个词典的JSON文件:

{"team1participants": 
[ {
        "stats": {
            "item1": 3153, 
            "totalScore": 0, 
            ...
        }
   },
   {
        "stats": {
            "item1": 2123, 
            "totalScore": 5, 
            ...
        }
   },
   {
        "stats": {
            "item1": 1253, 
            "totalScore": 1, 
            ...
        }
   }
],
"team2participants": 
[ {
        "stats": {
            "item1": 1853, 
            "totalScore": 2, 
            ...
        }
   },
   {
        "stats": {
            "item1": 21523, 
            "totalScore": 5, 
            ...
        }
   },
   {
        "stats": {
            "item1": 12503, 
            "totalScore": 1, 
            ...
        }
   }
]
}

换句话说,JSON有多个键。每个密钥都有一个包含各个参与者统计信息的列表。

我有很多这样的JSON文件,我想将它解压缩到一个CSV文件中。我当然可以手动执行此操作,但这非常繁琐。我知道DictWriter,但它似乎只适用于单个词典。我也知道字典可以连接起来,但这会有问题,因为所有字典都有相同的密钥。

如何有效地将其提取到CSV文件?

1 个答案:

答案 0 :(得分:3)

您可以使数据整洁,以便每行都是独特的观察结果。

teams = []
items = []
scores = []
for team in d:
    for item in d[team]:
        teams.append(team)
        items.append(item['stats']['item1'])
        scores.append(item['stats']['totalScore'])


# Using Pandas.
import pandas as pd

df = pd.DataFrame({'team': teams, 'item': items, 'score': scores})
>>> df
    item   score               team
0   1853       2  team2participants
1  21523       5  team2participants
2  12503       1  team2participants
3   3153       0  team1participants
4   2123       5  team1participants
5   1253       1  team1participants

你也可以使用列表理解而不是循环。

results = [[team, item['stats']['item1'], item['stats']['totalScore']] 
           for team in d for item in d[team]]
df = pd.DataFrame(results, columns=['team', 'item', 'score'])

然后,您可以执行数据透视表,例如:

>>> df.pivot_table(values='score ', index='team ', columns='item', aggfunc='sum').fillna(0)
item               1253   1853   2123   3153   12503  21523
team                                                       
team1participants      1      0      5      0      0      0
team2participants      0      2      0      0      1      5

此外,现在它是一个数据框,很容易将其保存为CSV格式。

df.to_csv(my_file_name.csv)