Преобразование CSV в иерархический вывод JSON

#python #json #pandas #csv #dictionary

#python #json #pandas #csv #словарь

Вопрос:

Я пытаюсь преобразовать файл CSV в иерархический файл JSON.Файл CSV вводится следующим образом, он содержит два столбца Gene и Disease.

 gene,disease
A1BG,Adenocarcinoma
A1BG,apnea
A1BG,Athritis
A2M,Asthma
A2M,Astrocytoma
A2M,Diabetes
NAT1,polyps
NAT1,lymphoma
NAT1,neoplasms
  

Ожидаемый формат вывода должен быть в следующем формате

 {
     "name": "A1BG",
     "children": [
      {"name": "Adenocarcinoma"},
      {"name": "apnea"},
      {"name": "Athritis"}
      ]
    },

{
     "name": "A2M",
     "children": [
      {"name": "Asthma"},
      {"name": "Astrocytoma"},
      {"name": "Diabetes"}
      ]
    },


{
     "name": "NAT1",
     "children": [
      {"name": "polyps"},
      {"name": "lymphoma"},
      {"name": "neoplasms"}
      ]
    }
   
  

Код Python, который я написал, приведен ниже. дайте мне знать, где мне нужно изменить, чтобы получить желаемый результат.

 import json
finalList = []
finalDict = {}
grouped = df.groupby(['gene'])

for key, value in grouped:

    dictionary = {}
    dictList = []
    anotherDict = {}

    j = grouped.get_group(key).reset_index(drop=True)
    dictionary['name'] = j.at[0, 'gene']

    for i in j.index:    
        anotherDict['disease'] = j.at[i, 'disease']
        dictList.append(anotherDict)

    dictionary['children'] = dictList
    finalList.append(dictionary)

with open('outputresult3.json', "w") as out:
    json.dump(finalList,out)
  

Ответ №1:

 import json

json_data = []

# group the data by each unique gene
for gene, data in df.groupby(["gene"]):

    # obtain a list of diseases for the current gene
    diseases = data["disease"].tolist()

    # create a new list of dictionaries to satisfy json requirements
    children = [{"name": disease} for disease in diseases]
    
    entry = {"name": gene, "children": children}
    json_data.append(entry)
    
with open('outputresult3.json', "w") as out:
    json.dump(json_data, out)
  

Ответ №2:

Используйте DataFrame.groupby с пользовательской функцией lambda для преобразования значений в словари с помощью DataFrame.to_dict :

 L = (df.rename(columns={'disease':'name'})
       .groupby('gene')
       .apply(lambda x: x[['name']].to_dict('records'))
       .reset_index(name='children')
       .rename(columns={'gene':'name'})
       .to_dict('records')
       )
print (L)
[{'name': 'A1BG', 'children': [{'name': 'Adenocarcinoma'},
                               {'name': 'apnea'}, 
                               {'name': 'Athritis'}]}, 
 {'name': 'A2M', 'children': [{'name': 'Asthma'}, 
                              {'name': 'Astrocytoma'}, 
                              {'name': 'Diabetes'}]}, 
 {'name': 'NAT1', 'children': [{'name': 'polyps'},
                               {'name': 'lymphoma'}, 
                               {'name': 'neoplasms'}]}]

with open('outputresult3.json', "w") as out:
    json.dump(L,out)