使用pandas将CSV转换为JSON,但需要特定格式

gstyhher  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(134)

我想将一个非常规的CSV格式转换为一个非常特定格式的JSON文件。我不允许编辑CSV本身来解决问题,必须使用pandas来提取CSV数据。
我的CSV看起来像这样(较小的版本):
| 姓名、名称|检查名称1|考试分数1|检查名称2|考试分数2| Exam mark 2 |
| --|--|--|--|--| ------------ |
| 约翰·史密斯|计算|七十二|数学|九十| 90 |
| 艾米·史密斯|历史记录|十二岁|数学|四十六| 46 |
CSV比这个长得多,有32个检查名称和标记条目。
我需要我的JSON看起来像这样:

{
    "Students": [
            {
                "123":{
                "Name": "John Smith",
                "Marks": [
                {
                  "Exam Name": "Computing"
                  "Exam Mark": 72
                },
                {
                  "Exam Name": "Maths"
                  "Exam Mark": 90
                }
              ]
            },
            {
                "124":{
                "Name": "Amy Smith",
                "Marks": [
                {
                  "Exam Name": "History"
                  "Exam Mark": 12
                },
                {
                  "Exam Name": "Maths"
                  "Exam Mark": 46
                }
              ]
            },
etc...

字符串
请大家帮帮忙:)

data = {} 
stu = data["Student"] = []

df=pd.read_csv(csvFilePath,usecols=[0, 1])
stu.append(df.set_index('id').T.to_dict('dicts'))


给出:

{
    "Student": [
        {
            "123": {
                  "Name": "John Smith"
            },
            "124": {
                  "Name": "Amy Smith"
            },


然后我如何添加标记,使其看起来像顶部的示例?
我知道我可以通过数字访问特定的列,但我不知道如何循环访问它们并将它们添加到json文件中的正确位置。

8yoxcaq7

8yoxcaq71#

使用您提供的dataframe:

import pandas as pd

df = pd.DataFrame(
    {
        "ID": [123, 124],
        "Name": ["John Smith", "Amy Smith"],
        "Exam name 1": ["Computing", "History"],
        "Exam mark 1": [72, 12],
        "Exam name 2": ["Maths", "Maths"],
        "Exam mark 2": [90, 46],
    }
)

字符串
以下是使用Pandas iterrows的一种方法:

stu = {"Students": []}

for _, row in df.iterrows():
    stu["Students"].append(
        {
            row["ID"]: {
                "Name": row["Name"],
                "Marks": [
                    {
                        "Exam Name": row[f"Exam name {i}"],
                        "Exam Mark": row[f"Exam mark {i}"],
                    }
                    for i in range(1, 3)
                ],
            }
        }
    )


然后:

print(stu)
# Output

{'Students': [{123: {'Name': 'John Smith',
                     'Marks': [{'Exam Name': 'Computing', 'Exam Mark': 72},
                               {'Exam Name': 'Maths', 'Exam Mark': 90}]}},
              {124: {'Name': 'Amy Smith',
                     'Marks': [{'Exam Name': 'History', 'Exam Mark': 12},
                               {'Exam Name': 'Maths', 'Exam Mark': 46}]}}]}

相关问题