首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python/熊猫将CSV转换为嵌套的JSON

使用Python/熊猫将CSV转换为嵌套的JSON
EN

Stack Overflow用户
提问于 2017-01-25 04:44:52
回答 1查看 4.4K关注 0票数 0

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

代码语言:javascript
复制
# 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结构:

代码语言:javascript
复制
{"data": [{
            "company_id": 1,
            "name": "Foobar Inc",
            "income": ["royalties": 5000000]
        }, 
        {
            "company_id": 2,
            "company_name": "ACME Corp",
            "income": [
                "sales": 3000000,
                "rent": 1000000
            ]
        }]
}

但是我现在的代码(基于this并使用Python和熊猫库):

代码语言:javascript
复制
# 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))

输出此格式:

代码语言:javascript
复制
{"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值时,遇到了困难。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-25 07:23:13

你可以这样做:

代码语言:javascript
复制
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()
        }})

这给了你:

代码语言:javascript
复制
[{'company_id': 1,
  'company_name': 'Foobar Inc',
  'income': {'royalties': 5000000}},
 {'company_id': 2,
  'company_name': 'ACME Corp',
  'income': {'rent': 1000000, 'sales': 3000000}}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41843550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档