2017-01-25 4 views
0

Ich versuche, eine flache CSV in ein verschachteltes JSON-Format zu konvertieren. Dies ist meine Daten:CSV zu verschachtelten JSON mit Python/Pandas

# 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 

Und müssen die folgenden JSON-Struktur konvertieren:

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

Aber meine aktuellen Code (basierend auf this und mit Python und die Pandas Bibliothek):

# 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)) 

Gibt folgendes Format:

{"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" 
      ] 
     } 
    ]} 

Trifft auf eine Wand, um herauszufinden, wie man Zeilen mit demselben company_id zu einem einzigen Objekt kombiniert und die Werte income_amt hinzufügt.

Antwort

1

Sie können es wie folgt tun:

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() 
     }}) 

Das gibt Ihnen:

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