Как объединить два csv-файла для создания одного объекта JSON с определенными именами заголовков с пандами

#python #json #pandas

Вопрос:

В настоящее время у меня есть две таблицы csv. Один предназначен для фармацевтических препаратов, а другой-для нутрицевтиков:
вот Фармацевтические препараты

                   Drug  Percentile
0     SZ Antipsychotic          57
1              AMG 811          57
2           Colchicine          57
3            Ibuprofen          29
4    Sleep Deprivation          29
5            Rofecoxib          29
 

а вот нутрицевтики

                                              Drug  Percentile
0                                          Canova          57
1                             Omega-3 fatty acids          43
2                                        Luteolin          29
3   Ethanol Extract of Aurantiochytrium sp. (EEA)          14
4                                         Osthole          14
5                 Arisaema amurense var. serratum          14
 

Мне в основном нужно объединить эти два csv-файла в один объект JSON таким образом, чтобы каждая таблица представляла собой массив словарей в паре с их соответствующей меткой. Ожидаемый результат таков (имена разные, здесь важна только структура).:

 {
"nutraceuticals": [
        {
            "name": "Omega-3 fatty acids",
            "percentile": 38
        },
        {
            "name": "Luteolin",
            "percentile": 25
        },
        {
            "name": "Vitamin D",
            "percentile": 25
        },
        {
            "name": "Probiotics supplements",
            "percentile": 13
        }
    ],
    "pharmaceuticals": [
        {
            "name": "Dexamethasone",
            "percentile": 25
        },
        {
            "name": "Rofecoxib",
            "percentile": 25
        },
        {
            "name": "Ibuprofen",
            "percentile": 25
        },
        {
            "name": "Laquinimod",
            "percentile": 25
        },
        {
            "name": "Lumiliximab",
            "percentile": 25
        }
   ]
}
 

В настоящее время у меня есть этот код:

 result = Drug_Scoring.to_json(orient="records")
    parsed = json.loads(result)
    parsed = json.dumps(parsed, indent=4)  
 

который создает правильный формат в коде словаря, здесь:

 [
    {
        "Drug": " Canova",
        "Percentile": 57
    },
    {
        "Drug": " Omega-3 fatty acids",
        "Percentile": 43
    },
    {
        "Drug": " Luteolin",
        "Percentile": 29
    },
    {
        "Drug": " Ethanol Extract of Aurantiochytrium sp. (EEA)",
        "Percentile": 14
    }
]
 

и так далее, но не объединяет эти два и не имеет надлежащей маркировки, например, "pharmaceuticals": [ и "nutraceuticals": [ мне в основном нужны два имени csv-файла, чтобы быть заголовками массива в объекте JSON, а затем объединить их. Спасибо.

Ответ №1:

сначала создайте объект словаря из ваших двух фреймов данных.

 d = dict(zip(['Pharmaceuticals','Nutraceuticals'], 
                [Pharmaceuticals,Nutraceuticals]))

out = {k : v.rename(columns={'Drug' : 'name', 'Percentile' : 'percentile'}
        ).to_dict(orient='records')
     for k,v in d.items() }
 

 print(out)

{'Pharmaceuticals': [{'name': 'SZ Antipsychotic', 'percentile': 57},
  {'name': 'AMG 811', 'percentile': 57},
  {'name': 'Colchicine', 'percentile': 57},
  {'name': 'Ibuprofen', 'percentile': 29},
  {'name': 'Sleep Deprivation', 'percentile': 29},
  {'name': 'Rofecoxib', 'percentile': 29}],
 'Nutraceuticals': [{'name': 'Canova', 'percentile': 57},
  {'name': 'Omega-3 fatty acids', 'percentile': 43},
  {'name': 'Luteolin', 'percentile': 29},
  {'name': 'Ethanol Extract of Aurantiochytrium sp. (EEA)', 'percentile': 14},
  {'name': 'Osthole', 'percentile': 14},
  {'name': 'Arisaema amurense var. serratum', 'percentile': 14}]}
 

затем сбросьте в json.

 with open('yourfile.json','w') as fp:
    json.dump(out,fp,indent=4)
 

yourfile.json

 {
    "Pharmaceuticals": [
        {
            "name": "SZ Antipsychotic",
            "percentile": 57
        },
        {
            "name": "AMG 811",
            "percentile": 57
        },
        {
            "name": "Colchicine",
            "percentile": 57
        },
        {
            "name": "Ibuprofen",
            "percentile": 29
        },
        {
            "name": "Sleep Deprivation",
            "percentile": 29
        },
        {
            "name": "Rofecoxib",
            "percentile": 29
        }
    ],
    "Nutraceuticals": [
        {
            "name": "Canova",
            "percentile": 57
        },
        {
            "name": "Omega-3 fatty acids",
            "percentile": 43
        },
        {
            "name": "Luteolin",
            "percentile": 29
        },
        {
            "name": "Ethanol Extract of Aurantiochytrium sp. (EEA)",
            "percentile": 14
        },
        {
            "name": "Osthole",
            "percentile": 14
        },
        {
            "name": "Arisaema amurense var. serratum",
            "percentile": 14
        }
    ]
}