【问题标题】:Pandas - normalize Json listPandas - 规范化 Json 列表
【发布时间】:2020-12-11 01:21:41
【问题描述】:

我正在尝试规范化 Pandas 数据框中的列,该列是字典列表(可能会丢失)。

复制示例

import pandas as pd
bids = pd.Series([[{'price': 606, 'quantity': 28},{'price': 588, 'quantity': 29},
                   {'price': 513, 'quantity': 33}],[],[{'price': 7143, 'quantity': 15},
                    {'price': 68, 'quantity': 91},{'price': 6849, 'quantity': 12}]])
data = pd.DataFrame([1,2,3]).rename(columns={0:'id'})
data['bids'] = bids

期望的输出

id price quantity
1  606    28
1  588    29
1  513    33
3  7143   15
3  68     91
3  6849   12

尝试

按照文档here 尝试使用 pandas json_normalize 解决。我很困惑为什么以下方法都不起作用,以及什么类型的 record_path 可以解决我的问题。以下所有错误。

pd.json_normalize(data['bids'])
pd.json_normalize(data['bids'],['price','quantity'])
pd.json_normalize(data['bids'],[['price','quantity']])

【问题讨论】:

    标签: python json pandas dataframe normalize


    【解决方案1】:

    在bids 列上使用DataFrame.explode,然后从爆炸的bids 列中的字典创建一个新数据框,并将DataFrame.join 与join 一起使用df:

    df = data.explode('bids').dropna(subset=['bids']).reset_index(drop=True)
    df = df.join(pd.DataFrame(df.pop('bids').tolist()))
    

    结果:

    print(df)
       id  price  quantity
    0   1    606        28
    1   1    588        29
    2   1    513        33
    3   3   7143        15
    4   3     68        91
    5   3   6849        12
    

    【讨论】:

      【解决方案2】:

      用np.repeat 和np.concatenate 用json_normalize 添加另一种方法

      out = pd.io.json.json_normalize(np.concatenate(data['bids']))
      out.insert(0,'id',np.repeat(data['id'],data['bids'].str.len()).to_numpy())
      

      或者您也可以使用@Shubham 提到的np.hstack 而不是np.concatenate:

      out = pd.io.json.json_normalize(np.hstack(data['bids']))
      

      print(out)
      
         id  price  quantity
      0   1    606        28
      1   1    588        29
      2   1    513        33
      3   3   7143        15
      4   3     68        91
      5   3   6849        12
      

      【讨论】:

        猜你喜欢
        • 2021-07-11
        • 1970-01-01
        • 2021-04-26
        • 2018-03-27
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多