【问题标题】:Pandas: Unpacking a list of dictionaries in cell to columns熊猫:将单元格中的字典列表解压缩到列
【发布时间】:2020-11-18 19:39:49
【问题描述】:

我有以下数据框

d = {'id': {0: 'f0c92a3d-e845-446d-b802-704fcdc1ca94',
  1: '2c5ce4ff-aee3-4b45-8783-bb44b5d75fb3'},
  'usd_value': {0: 315574704.6100155,
  1: 267332059.93445513},

 'purchases': {0: [{'name': 'toy1',
    'symbol': 't1',
    'price': 9664},
   {'name': 'toy2',
    'symbol': 't2',
    'price': 8730}],
  1: [{'name': 'toy1',
    'symbol': 't1',
    'price': 5266},
   {'name': 'toy2',
    'symbol': 't2',
    'price': 107675},
   {'name': 'toy3',
    'symbol': 't3',
    'price': 106994}],
  }}

>>> pd.DataFrame(d)

    id                                      usd_value       purchases
0   f0c92a3d-e845-446d-b802-704fcdc1ca94    3.155747e+08    [{'name': 'toy1', 'symbol': 't1', 'price': 966...
1   2c5ce4ff-aee3-4b45-8783-bb44b5d75fb3    2.673321e+08    [{'name': 'toy1', 'symbol': 't1', 'price': 5...

我想将purchases 列中的字典列表解压缩到名为namesymbolprice 的单独列中。

请注意,每个 id 可能有不同的购买次数(即字典列表的长度可能不同)。我希望重复每个购买项目的iduse_value。我希望新的数据框看起来像这样

    id                                      usd_value       name    symbol price
0   f0c92a3d-e845-446d-b802-704fcdc1ca94    3.155747e+08    toy1    t1     9664
1   f0c92a3d-e845-446d-b802-704fcdc1ca94    3.155747e+08    toy2    t2     8730

我在打开它时遇到了一些麻烦,因为该列是一个字典列表。

【问题讨论】:

    标签: python pandas reshape


    【解决方案1】:
    df = pd.DataFrame(d)
    df2 = df.explode('purchases').reset_index(drop=True)
    df3 = pd.DataFrame.from_records(df2['purchases'].values)
    df2.join(df3).drop(columns = ['purchases'])
    

    你得到

    
         id                                     usd_value    name   symbol  price
    0   f0c92a3d-e845-446d-b802-704fcdc1ca94    3.155747e+08    toy1    t1  9664
    1   f0c92a3d-e845-446d-b802-704fcdc1ca94    3.155747e+08    toy2    t2  8730
    2   2c5ce4ff-aee3-4b45-8783-bb44b5d75fb3    2.673321e+08    toy1    t1  5266
    3   2c5ce4ff-aee3-4b45-8783-bb44b5d75fb3    2.673321e+08    toy2    t2  107675
    4   2c5ce4ff-aee3-4b45-8783-bb44b5d75fb3    2.673321e+08    toy3    t3  106994
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      df = pd.json_normalize(df['purchases'])
      

      【讨论】:

      • 这是我得到的错误 AttributeError: 'list' object has no attribute 'values'
      【解决方案3】:

      尝试:

      df = df.explode('purchases') #unnest the list
      pd.concat([df.drop(['purchases'], axis=1), df['purchases'].apply(pd.Series)], axis=1) #unpack the dictionary
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2023-02-14
        • 1970-01-01
        • 2019-08-20
        • 2017-01-31
        • 2018-04-19
        相关资源
        最近更新 更多