簡體   English   中英

使用 Python 拆分 JSON 文件的最簡單方法

[英]Easiest way to split JSON file using Python

我正在研究 2015 年至 2020 年世界幸福報告的交互式可視化。數據分為 6 個 csv 文件。 使用 pandas,我成功地清理了數據並將它們連接成一個大的 JSON 文件,格式如下:

[
  {
    "Country": "Switzerland",
    "Year": 2015,
    "Happiness Rank": 1,
    "Happiness Score": 7.587000000000001,
  },
  {
    "Country": "Iceland",
    "Year": 2015,
    "Happiness Rank": 2,
    "Happiness Score": 7.561,
  },
  {
    "Country": "Switzerland",
    "Year": 2016,
    "Happiness Rank": 2,
    "Happiness Score": 7.5089999999999995,
  },
  {
    "Country": "Iceland",
    "Year": 2016,
    "Happiness Rank": 3,
    "Happiness Score": 7.501,
  },
  {
    "Country": "Switzerland",
    "Year": 2017,
    "Happiness Rank": 3,
    "Happiness Score": 7.49399995803833,
  },
  {
    "Country": "Iceland",
    "Year": 2017,
    "Happiness Rank": 1,
    "Happiness Score": 7.801,
  }
]

現在,我想以編程方式格式化 JSON 文件,使其具有以下格式:

{
    "2015": {
        "Switzerland": {
            "Happiness Rank": 1,
            "Happiness Score": 7.587000000000001
        },
        "Iceland": {
            "Happiness Rank": 2,
            "Happiness Score": 7.561
        }
    },
    "2016": {
        "Switzerland": {
            "Happiness Rank": 2,
            "Happiness Score": 7.5089999999999995
        },
        "Iceland": {
            "Happiness Rank": 3,
            "Happiness Score": 7.501
        }
    },
    "2017": {
        "Switzerland": {
            "Happiness Rank": 3,
            "Happiness Score": 7.49399995803833
        },
        "Iceland": {
            "Happiness Rank": 1,
            "Happiness Score": 7.801
        }
    }
}

它必須以編程方式完成,因為有超過 900 個不同的(國家、年份)對。 我想要這種格式的 JSON,因為它使 JSON 文件更具可讀性,並使 select 更容易獲得適當的數據。 如果我想要 2015 年冰島的排名,那么我可以做data[2015]["Iceland"]["Happiness Rank"]

有誰知道在 Python 中最簡單/最方便的方法嗎?

如果data是您的原始字典列表:

def by_year(data):
    from itertools import groupby
    from operator import itemgetter

    retain_keys = ("Happiness Rank", "Happiness Score")

    for year, group in groupby(data, key=itemgetter("Year")):
        as_tpl = tuple(group)
        yield str(year), dict(zip(map(itemgetter("Country"), as_tpl), [{k: d[k] for k in retain_keys} for d in as_tpl]))


print(dict(by_year(data)))

Output:

{'2015': {'Switzerland': {'Happiness Rank': 1, 'Happiness Score': 7.587000000000001}, 'Iceland': {'Happiness Rank': 2, 'Happiness Score': 7.561}}, '2016': {'Switzerland': {'Happiness Rank': 2, 'Happiness Score': 7.5089999999999995}, 'Iceland': {'Happiness Rank': 3, 'Happiness Score': 7.501}}, '2017': {'Switzerland': {'Happiness Rank': 3, 'Happiness Score': 7.49399995803833}, 'Iceland': {'Happiness Rank': 1, 'Happiness Score': 7.801}}}
>>> 

這假設data中的字典已經按年份分組在一起。

我假設您擁有創建此 JSON 的原始 pandas dataframe。 使用 pandas,您可以執行df = df.groupby(['Year', 'Country']) 然后可以按照pandas groupby嵌套json中的流程,將其轉化為JSON。

您可能會發現 itertools 模塊中的groupby很有用。 我能夠做到這一點

import itertools
groups = itertools.groupby(data, lambda x: x["Year"])
newdict = {str(year): {entry["Country"]:entry for entry in group} for year, group in groups}

其中data是您給出的示例形式的數據

它會保留dict中原來的字段,但是可以通過這種方式輕松刪除

for countries in newdict.values():
    for c in countries.values():
        del c["Year"]
        del c["Country"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM