【问题标题】:CSV to nested JSON using Python/pandas使用 Python/pandas 将 CSV 转换为嵌套 JSON
【发布时间】:2017-06-10 03:48:33
【问题描述】:

我正在尝试将平面 CSV 转换为嵌套的 JSON 格式。这是我的数据:

# data.csv
company_id,company_name,income_type,income_amt
1,"Foobar Inc","royalties",5000000
2,"ACME Corp","sales",3000000
2,"ACME Corp","rent",1000000

并且需要转换成如下的JSON结构:

{"data": [{
            "company_id": 1,
            "name": "Foobar Inc",
            "income": ["royalties": 5000000]
        }, 
        {
            "company_id": 2,
            "company_name": "ACME Corp",
            "income": [
                "sales": 3000000,
                "rent": 1000000
            ]
        }]
}

但我当前的代码(基于 this 并使用 Python 和 pandas 库):

# script.py
import json
import pandas as pd

df = pd.read_csv('data.csv')

def get_nested_rec(key, grp):
rec = {}

    rec['company_id'] = key[0]
    rec['company_name'] = key[1]

    for field in ['income_type']:
        income_types = list(grp[field].unique())
        rec['income'] = income_types

    return rec

records = []

for key, grp in df.groupby(['company_id','company_name','income_type','income_amt']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)

print(json.dumps(records, indent=4))

输出这种格式:

{"data": [
        {
            "company_id": 1,
            "company_name": "Foobar Inc", 
            "income": [
                "royalties"
            ]
        }, 
        {
            "company_id": 2,
            "company_name": "ACME Corp",
            "income": [
                "sales"
            ]
        }, 
        {
            "company_id": 2,
            "company_name": "ACME Corp",
            "income": [
                "rent"
            ]
        }
    ]}

在弄清楚如何将具有相同 company_id 的行组合成一个对象并添加 income_amt 值时遇到了困难。

【问题讨论】:

    标签: python json csv pandas


    【解决方案1】:

    你可以这样做:

    for key, grp in df.groupby('company_id'):
        records.append({
            "company_id": key,
            "company_name": grp.company_name.iloc[0],
            "income": {
                row.income_type: row.income_amt for row in grp.itertuples()
            }})
    

    这给了你:

    [{'company_id': 1,
      'company_name': 'Foobar Inc',
      'income': {'royalties': 5000000}},
     {'company_id': 2,
      'company_name': 'ACME Corp',
      'income': {'rent': 1000000, 'sales': 3000000}}]
    

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2021-08-26
      • 2019-11-14
      • 2019-07-21
      • 1970-01-01
      • 2018-10-27
      • 2021-05-17
      • 2017-09-12
      • 2019-03-15
      相关资源
      最近更新 更多