【问题标题】:CSV to nested (hierarchical) JSON - labelling parents using PythonCSV 到嵌套(分层)JSON - 使用 Python 标记父母
【发布时间】:2018-10-05 11:00:04
【问题描述】:

我有一个名为 data.csv 的 CSV 文件。我正在将 CSV 文件转换为嵌套的 JSON 并使用 python 将其插入到 mongodb。下面是代码,但在这里我想在名为“Name”的父级下标记 FirstName 和 LastName。有人可以帮忙吗?

import json
import pandas as pd
from pymongo import MongoClient

try: 
    conn = MongoClient() 
    print("Connected successfully!!!") 
except:   
    print("Could not connect to MongoDB") 

# database 
db = conn.database
collection = db.collection3 

df = pd.read_csv(r'C:\Users\swetha1\Desktop\data.csv')

def get_nested_rec(key, grp):
    rec = {}
    rec['PrimaryId'] = key[0]
    rec['FirstName'] = key[1]
    rec['LastName'] = key[2]
    rec['City'] = key[3]

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

    return rec

records = []
for key, grp in df.groupby(['PrimaryId','FirstName','LastName','City']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)

r=json.dumps(records,default=int,indent=4)

my_dict = json.loads(r)
print(my_dict)
collection.insert(my_dict)
print('inserted')

以上代码将 CSV 转换为嵌套的 JSON

将 CSV 转换为嵌套 JSON 的输出如下:

Connected successfully!!!
{
    "data": [
        {
            "PrimaryId": 100,
            "FirstName": "John",
            "LastName": "Smith",
            "City": "NewYork",
            "CarName": [
                "Toyota",
                "BMW"
            ],
            "DogName": [
                "Spike",
                "Rusty"
            ]
        },
        {
            "PrimaryId": 101,
            "FirstName": "Ben",
            "LastName": "Swan",
            "City": "Sydney",
            "CarName": [
                "Volkswagen",
                "Ford",
                "Audi"
            ],
            "DogName": [
                "Buddy",
                "Max"
            ]
        },
    {
        "PrimaryId": 102,
        "FirstName": "Julia",
        "LastName": "Brown",
        "City": "London",
        "CarName": [
            "Mini"
        ],
        "DogName": [
            "Lucy"
        ]
    }
  ]
}

所需的输出结构应该是这样的: PS:我在这里给出了空白值只是为了示例。

"info":[
  { "primaryId":" "
    "City":" "
    "Name":
       { "FirstName":" "
         "LastName" :" "
       }
    "CarName":
       { "car1": " "
         "car2": " "
       }
    "DogName":
       { "Dog1": " "
         "Dog2": " "
       }
     }]

数据.CSV

PrimaryId,FirstName,LastName,City,CarName,DogName
100,John,Smith,NewYork,Toyota,Spike
100,John,Smith,NewYork,BMW,Spike
100,John,Smith,NewYork,Toyota,Rusty
100,John,Smith,NewYork,BMW,Rusty
101,Ben,Swan,Sydney,Volkswagen,Buddy
101,Ben,Swan,Sydney,Ford,Buddy
101,Ben,Swan,Sydney,Audi,Buddy
101,Ben,Swan,Sydney,Volkswagen,Max
101,Ben,Swan,Sydney,Ford,Max
101,Ben,Swan,Sydney,Audi,Max
102,Julia,Brown,London,Mini,Lucy

【问题讨论】:

  • 是的!我已编辑。我错过了。对不起

标签: python json mongodb csv nested


【解决方案1】:

这是一种方法。

演示:

import pandas as pd

df = pd.read_csv(filename)

def get_nested_rec(key, grp):
    rec = {}
    rec['PrimaryId'] = key[0]
    rec['City'] = key[3]
    rec["Name"] = [{'FirstName': key[1], 'LastName': key[2]}]                 #Update. 

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

    return rec

records = []
for key, grp in df.groupby(['PrimaryId','FirstName','LastName','City']):
    rec = get_nested_rec(key, grp)
    records.append(rec)

records = dict(data = records)
print(records)

输出:

{'data': [{'CarName': ['Toyota', 'BMW'],
       'City': 'NewYork',
       'DogName': ['Spike', 'Rusty'],
       'Name': [{'FirstName': 'John', 'LastName': 'Smith'}],
       'PrimaryId': 100},
      {'CarName': ['Volkswagen', 'Ford', 'Audi'],
       'City': 'Sydney',
       'DogName': ['Buddy', 'Max'],
       'Name': [{'FirstName': 'Ben', 'LastName': 'Swan'}],
       'PrimaryId': 101},
      {'CarName': ['Mini'],
       'City': 'London',
       'DogName': ['Lucy'],
       'Name': [{'FirstName': 'Julia', 'LastName': 'Brown'}],
       'PrimaryId': 102}]}

【讨论】:

  • 您好,请检查我编辑的问题。我已经发布了所需的输出。我希望它作为具有键值对的嵌套结构,并为父级提供所需的标签,例如名字和姓氏的“名称”。谢谢!
  • 它正在工作。但是当我将新列(Addr1,Addr2)添加到 CSV 文件并在代码中进行一些更改时,出现以下错误,如下所示。以错误结束。代码是:''rec["Name"] = [{'FirstName': key[1], 'LastName': key[2]}] rec["Address"] = [{'Addr1': key[6 ], 'Addr2': key[7]}] ' 但显示错误:' rec["Address"] = [{'Addr1': key[6], 'Addr2': key[7]}] IndexError: tuple index超出范围'请帮帮我..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2021-09-17
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多