Python 使用pandas将CSV转换为嵌套JSON-输出稍微关闭

Python 使用pandas将CSV转换为嵌套JSON-输出稍微关闭,python,json,csv,Python,Json,Csv,我在裁剪衣服以满足我的需要方面遇到了困难。我觉得我很接近,但我没有达到目标。目标是从csv文件创建嵌套的JSON。我在下面有所需的输出、CSV数据和当前代码。感谢您的帮助 当前代码: import json import pandas as pd df = pd.read_csv('txn_data.csv') def get_nested_rec(key, grp): rec = {} rec['date'] = key[0] rec['name'] = key[1

我在裁剪衣服以满足我的需要方面遇到了困难。我觉得我很接近,但我没有达到目标。目标是从csv文件创建嵌套的JSON。我在下面有所需的输出、CSV数据和当前代码。感谢您的帮助

当前代码:

import json
import pandas as pd

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

def get_nested_rec(key, grp):
    rec = {}
    rec['date'] = key[0]
    rec['name'] = key[1]
    rec['value'] = key[2]

    for field in ['name','value']:
        rec[field] = list(grp[field].unique())

    return rec

records = []
for key, grp in df.groupby(['date']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)

print(json.dumps(records, indent=4))
CSV数据:

date,name,value
1/1/13,Quick Serve,304127
1/1/13,Restaurant,1843286
1/1/13,Retail,239675
1/2/13,Quick Serve,422847
1/2/13,Restaurant,1582848
1/2/13,Retail,394358
所需的JSON输出:

desired_output = [  
   {  
      "date":"2017-01-01",
      "details":[  
         {  
            "name":"Retail",
            "value":9192
         },
         {  
            "name":"Restaurant",
            "value":6753
         },
         {  
            "name":"Quickserve",
            "value":1219
         }
      ]
   },
   {  
      "date":"2017-02-01",
      "details":[  
         {  
            "name":"Retail",
            "value":9192
         },
         {  
            "name":"Restaurant",
            "value":6753
         },
         {  
            "name":"Quickserve",
            "value":1219
         }
      ]
   }
]
我目前得到的是:

{
    "data": [
        {
            "date": "1", 
            "name": [
                "Automotive", 
                "Durable Goods", 
                "Entertainment", 
                "Food", 
                "Lodging", 
                "Petroleum", 
                "Quick Serve", 
                "Restaurant", 
                "Retail", 
                "Service", 
                "Transportation & Utilities", 
                "Unknown"
            ], 
            "value": [
                91406, 
                9889, 
                172676, 
                358922, 
                63502, 
                1982048, 
                304127, 
                1843286, 
                239675, 
                106462, 
                25924, 
                909
            ]
        }, 
        {
            "date": "1", 
            "name": [
                "Automotive", 
                "Durable Goods", 
                "Entertainment", 
                "Food", 
                "Lodging", 
                "Petroleum", 
                "Quick Serve", 
                "Restaurant", 
                "Retail", 
                "Service", 
                "Transportation & Utilities", 
                "Unknown"
            ], 
            "value": [
                146041, 
                33090, 
                103159, 
                336956, 
                66726, 
                2191346, 
                422847, 
                1582848, 
                394358, 
                339989, 
                49477, 
                494
            ]
        }
    ]
}

我将尝试用以下更简单的方法解决此任务:

import json
import pandas as pd

df = pd.read_csv('test.csv')
l_data = []
data = {}

for key,grp in df.groupby('date'):
    data['date'] = key
    data['details'] = df.loc[df['date'] == key][['name','value']].to_json(orient='records')
    l_data.append(data)

In [32]:
print(json.dumps(l_data))

Out[32]:
[  
   {  
      "date":"1/2/13",
      "details":[  
         {  
            "name":"Quick Serve",
            "value":422847
         },
         {  
            "name":"Restaurant",
            "value":1582848
         },
         {  
            "name":"Retail",
            "value":394358
         }
      ]
   },
   {  
      "date":"1/2/13",
      "details":[  
         {  
            "name":"Quick Serve",
            "value":422847
         },
         {  
            "name":"Restaurant",
            "value":1582848
         },
         {  
            "name":"Retail",
            "value":394358
         }
      ]
   }
]

我将尝试用以下更简单的方法解决此任务:

import json
import pandas as pd

df = pd.read_csv('test.csv')
l_data = []
data = {}

for key,grp in df.groupby('date'):
    data['date'] = key
    data['details'] = df.loc[df['date'] == key][['name','value']].to_json(orient='records')
    l_data.append(data)

In [32]:
print(json.dumps(l_data))

Out[32]:
[  
   {  
      "date":"1/2/13",
      "details":[  
         {  
            "name":"Quick Serve",
            "value":422847
         },
         {  
            "name":"Restaurant",
            "value":1582848
         },
         {  
            "name":"Retail",
            "value":394358
         }
      ]
   },
   {  
      "date":"1/2/13",
      "details":[  
         {  
            "name":"Quick Serve",
            "value":422847
         },
         {  
            "name":"Restaurant",
            "value":1582848
         },
         {  
            "name":"Retail",
            "value":394358
         }
      ]
   }
]

我已经修改了您的代码,以您要求的格式输出

import json
import pandas as pd

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

def get_nested_rec(key, grp):
    rec = {}
    rec['date'] = key
    rec['details'] = []

    for index, row in grp.iterrows():
        rec['details'].append({
            'name': row['name'],
            'value': row['value']
        })

    return rec

records = []
for key, grp in df.groupby(['date']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)

print(json.dumps(records, indent=4))
以下是结果输出:

{
    "data": [
        {
            "date": "1/1/13", 
            "details": [
                {
                    "name": "Quick Serve", 
                    "value": 304127
                }, 
                {
                    "name": "Restaurant", 
                    "value": 1843286
                }, 
                {
                    "name": "Retail", 
                    "value": 239675
                }
            ]
        }, 
        {
            "date": "1/2/13", 
            "details": [
                {
                    "name": "Quick Serve", 
                    "value": 422847
                }, 
                {
                    "name": "Restaurant", 
                    "value": 1582848
                }, 
                {
                    "name": "Retail", 
                    "value": 394358
                }
            ]
        }
    ]
}

我已经修改了您的代码,以您要求的格式输出

import json
import pandas as pd

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

def get_nested_rec(key, grp):
    rec = {}
    rec['date'] = key
    rec['details'] = []

    for index, row in grp.iterrows():
        rec['details'].append({
            'name': row['name'],
            'value': row['value']
        })

    return rec

records = []
for key, grp in df.groupby(['date']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)

print(json.dumps(records, indent=4))
以下是结果输出:

{
    "data": [
        {
            "date": "1/1/13", 
            "details": [
                {
                    "name": "Quick Serve", 
                    "value": 304127
                }, 
                {
                    "name": "Restaurant", 
                    "value": 1843286
                }, 
                {
                    "name": "Retail", 
                    "value": 239675
                }
            ]
        }, 
        {
            "date": "1/2/13", 
            "details": [
                {
                    "name": "Quick Serve", 
                    "value": 422847
                }, 
                {
                    "name": "Restaurant", 
                    "value": 1582848
                }, 
                {
                    "name": "Retail", 
                    "value": 394358
                }
            ]
        }
    ]
}