【问题标题】:How can I convert nested dictionary to pd.dataframe faster?如何更快地将嵌套字典转换为 pd.dataframe?
【发布时间】:2020-09-15 11:44:15
【问题描述】:

我有一个像这样的 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"),然后使用像

这样的 for 循环
for ans, row in data.iterrows():
    ....
    ....
    df = df.append(the data)

但是使用它的问题是我的客户会花费大量时间拒绝该解决方案。 main 列表中有大约 1200 个项目,并且有 450 个这样的 json 文件需要转换。所以这个转换的中间过程需要将近一个小时才能完成。

编辑: 是否可以将my_valuevalue_2 的总和作为一列? (也更新了想要的结果)

【问题讨论】:

  • 你的 json 无效
  • 如果不了解您的问题的更多详细信息,我无法确定。但尝试先将数据附加到列表中,然后只在末尾创建 df,如 df = pd.DataFrame(question_numbers, questions, users, comments)
  • @Datanovice 现已更正
  • @DominicD 但是用户和 cmets 将被嵌套列表吗?

标签: python json pandas dictionary itertools


【解决方案1】:

通过main 使用参数record_pathmeta 选择字典:

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

【讨论】:

  • 你是救命的兄弟!难怪你有这么高的声望。
  • 是否有可能以某种方式在嵌套列表value 中获得my_valuevalue_2 的总和?我已经编辑了想要的结果。请检查一下
  • @jezael 实际上我要发布一个问题。但不得不等待 90 分钟才能发布另一个问题。这是链接stackoverflow.com/questions/62064879/… 我稍作修改以在值中包含submitted 键以匹配我的确切情况。如果可以请在那里回答。这对标题和有同样问题的人来说是有意义的
  • @Derik81 - 谢谢,但似乎 json 无效,刚刚在 link 中测试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2020-09-03
  • 2013-12-07
  • 2019-12-09
  • 2019-10-10
相关资源
最近更新 更多