Как я могу быстрее преобразовать вложенный словарь в pd.dataframe? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть файл json, который выглядит так

{
    "file": "name",
    "main": [{
        "question_no": "Q.1",
        "question": "what is ?",
        "answer": [{
                "user": "John",
                "comment": "It is defined as",
                "value": [
                          {
                            "my_value": 5,
                            "value_2": 10
                          },
                          {
                            "my_value": 24,
                            "value_2": 30
                          }
                          ]
            },
            {
                "user": "Sam",
                "comment": "as John said above it simply means",
                "value": [
                          {
                            "my_value": 9,
                            "value_2": 10
                          },
                          {
                            "my_value": 54,
                            "value_2": 19
                          }
                          ]
            }
        ],
        "closed": "no"
    }]
}

желаемый результат:

Question_no      question  my_value_sum      value_2_sum       user      comment
Q.1             what is ?      29                40            john    It is defined as
Q.1             what is ?      63                29            Sam     as John said above it simply means

Я пробовал data = json_normalize(file_json, "main"), а затем использовал для l oop как

for ans, row in data.iterrows():
    ....
    ....
    df = df.append(the data)

Но проблема в том, что мой клиент откажется от решения очень долго. в списке main около 1200 элементов и 450 json файлов, которые нужно преобразовать. Таким образом, этот промежуточный процесс преобразования займет почти час.

EDIT: возможно ли получить сумму my_value и value_2 в виде столбца? (обновил также желаемый результат)

1 Ответ

2 голосов
/ 28 мая 2020

Выбрать словарь по main с параметром record_path и meta:

data = pd.json_normalize(file_json["main"], 
                         record_path='answer', 
                         meta=['question_no', 'question'])
print (data)
   user                             comment question_no   question
0  John                    It is defined as         Q.1  what is ?
1   Sam  as John said above it simply means         Q.1  what is ?

Затем, если важен порядок, преобразовать последние N столбцов в первые позиции:

N = 2
data = data[data.columns[-N:].tolist() + data.columns[:-N].tolist()]
print (data)
  question_no   question  user                             comment
0         Q.1  what is ?  John                    It is defined as
1         Q.1  what is ?   Sam  as John said above it simply means
...