使用python panda将csv转换为json

hs1ihplo  于 2023-02-15  发布在  Python
关注(0)|答案(2)|浏览(136)

我需要将一个csv文件转换成json文件。我已经尝试了一些python的例子,可在线,但似乎没有适合我的需要。
我的csv文件包含一个标题,然后每个日期有多行。我不完全确定术语,但我认为我需要在csv(NA,NE,SE)的第一个字段中的每个唯一ID在json中有自己的对象。
任何帮助都将不胜感激。干杯!
输入示例

A1,sDate,eDate,A2
NA,01/01/2023,01/05/2023,2
NE,01/01/2023,01/05/2023,3
SE,01/01/2023,01/05/2023,4
NA,02/01/2023,02/05/2023,5
NE,02/01/2023,02/05/2023,6
SE,02/01/2023,02/05/2023,7

我想要的输出是

{
    "NA": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "a2": 2
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "a2": 5
        }
],
    "NE": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "a2": 3
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "a2": 6
        }
],
    "SE": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "a2": 4
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "a2": 7
        }
]

我正在使用Pandas图书馆来帮助这件事,但它没有给出我需要的结果。
一个二个一个一个

qnakjoqk

qnakjoqk1#

您可以使用panda和groupby:

import pandas as pd
import json

df = pd.read_csv("your_file.csv", keep_default_na=False)
res = {}
for a1, df_gp in df.groupby('A1'):
    res[a1] = df_gp.drop(columns='A1').to_dict(orient='records')
print(json.dumps(res, indent=4))

输出:

{
    "NA": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "A2": 2
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "A2": 5
        }
    ],
    "NE": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "A2": 3
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "A2": 6
        }
    ],
    "SE": [
        {
            "sDate": "01/01/2023",
            "eDate": "01/05/2023",
            "A2": 4
        },
        {
            "sDate": "02/01/2023",
            "eDate": "02/05/2023",
            "A2": 7
        }
    ]
}
rnmwe5a2

rnmwe5a22#

defaultdict对于此类处理非常有用

def build_structure(reader: typing.List[dict]) -> dict:
    structure = collections.defaultdict(list)
    for d in reader:
        structure[d["A1"]].append(
            {"sDate": d["sDate"], "eDate": d["eDate"], "a2": d["A2"]}
        )
    return structure

1.读取文件并创建文件的csv.DictReader,然后将其转换为列表,
1.将list发送到build_structure函数。
1.你有一个defaultdict,你可以用jsondumps它。

import collections
import csv
import json
import typing

def read_csv(file_name: str) -> list:
    with open(file_name, "r") as f:
        reader = csv.DictReader(f)
        return list(reader)

def build_structure(reader: typing.List[dict]) -> dict:
    structure = collections.defaultdict(list)
    for d in reader:
        structure[d["A1"]].append(
            {"sDate": d["sDate"], "eDate": d["eDate"], "a2": d["A2"]}
        )
    return structure

data = read_csv("data.csv")
structure = build_structure(data)
print(json.dumps(structure))
# {'NA': [{'a2': '2', 'eDate': '01/05/2023', 'sDate': '01/01/2023'},
#         {'a2': '5', 'eDate': '02/05/2023', 'sDate': '02/01/2023'}],
#  'NE': [{'a2': '3', 'eDate': '01/05/2023', 'sDate': '01/01/2023'},
#         {'a2': '6', 'eDate': '02/05/2023', 'sDate': '02/01/2023'}],
#  'SE': [{'a2': '4', 'eDate': '01/05/2023', 'sDate': '01/01/2023'},
#         {'a2': '7', 'eDate': '02/05/2023', 'sDate': '02/01/2023'}]}

相关问题