【问题标题】:python dict append values to dataframe after adding a row for dict keyspython dict在为dict键添加一行后将值附加到数据框
【发布时间】:2020-12-16 10:24:02
【问题描述】:

我有一个字典,其中键是 GitHub 存储库名称,值包含 JSON 格式的数据。

例如:


    {'r1':[
       {'id': 1178421030,
       'name': 'x',
        },
       {'id': 1178420990,
       'name': 'y',
       }],
    'r2':[
       {'id': 1178421031,
       'name': 'a',
        },
       {'id': 1178420950,
       'name': 'b',
       }]
    }

我可以使用 JSON 从字典中的值创建一个数据框:

df=pd.DataFrame()
for i in responses:
    
    df=df.append(pd.json_normalize(responses[i]))

这给了我一个看起来像这样的df:

   id              name
 1178421030           x
 1178420990           y 
 1178421031           a
 1178420950           b

我希望 dict 的键作为 df 中名为 repo_name 的另一列,类似于:

   id              name       repo_name
 1178421030           x          r1
 1178420990           y          r1
 1178421031           a          r2   
 1178420950           b          r2

我该怎么做呢?

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    假设您的 JSON 名为“d”

       data=pd.DataFrame()
       for i in d.keys():
            z=pd.DataFrame(d[i])
            z['repo_name']=i
            data=pd.concat([data,z])
    
    
    
               id name repo_name
    0  1178421030    x        r1
    1  1178420990    y        r1
    0  1178421031    a        r2
    1  1178420950    b        r2
    

    【讨论】:

      【解决方案2】:

      我建议使用collections.defaultdict;它应该允许您更好地控制您的数据收集:

      from collections import defaultdict
      
      d = defaultdict(list)
      for key, value in data.items():
          for entry in value:
              d["id"].append(entry["id"])
              d["name"].append(entry["name"])
              d["repo_name"].append(key)
      
      d
      
      defaultdict(list,
                  {'id': [1178421030, 1178420990, 1178421031, 1178420950],
                   'name': ['x', 'y', 'a', 'b'],
                   'repo_name': ['r1', 'r1', 'r2', 'r2']})
      

      创建数据框:

      pd.DataFrame(d)
      
            id      name  repo_name
      0   1178421030  x   r1
      1   1178420990  y   r1
      2   1178421031  a   r2
      3   1178420950  b   r2
      

      另一种选择是在列表理解中使用json_normalize

      pd.concat(pd.json_normalize(data, record_path=[key]).assign(repo_name=key) 
                for key in data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 1970-01-01
        • 2020-02-25
        • 2023-03-29
        • 2020-04-13
        相关资源
        最近更新 更多