【问题标题】:Extracting dictionary nested elements into a Pandas dataframe将字典嵌套元素提取到 Pandas 数据框中
【发布时间】:2021-11-06 07:13:18
【问题描述】:

我有一个字典列表l1,如下所示:

[{'A1': 'string',
  'B1': {'ba': 'string',
        'bb': 'string',
        'bc': 'string',
        'bd': 'string',
        'be': 'string'},
  'C1': {'ca': 'string',
        'cb': [[[123,123],[123,123]]]},
  'D1': 'string'},
  ...]

某些字典(l1 元素)可能缺少某些键,例如,l1 的第二个列表元素可能没有 'bc':''string' 键/值对.

我需要将以下顶部和嵌套的键/值元素提取到数据框中,如下所示:

bc      bd      cb                        D1
string  string  [[[123,123],[123,123]]]   string
N/A     string  [[[123,123],[123,123]]]   string
...
string  N/A     [[[123,123],[123,123]]]   string

我的代码如下:

temp_df = pd.DataFrame(columns = ['bc','bd','cb','D1']

for i in l1:
    temp_df = temp_df.append({'bc': i.get(['B1']['bc'],'N/A'),
                              'bd': i.get(['B1']['bd'],'N/A'),
                              'cb': i.get(['C1']['cb'],'N/A'),
                              'D1': i.get(['D1'],'N/A')}, 
                               ignore_index=True)

我得到的错误如下:

 ---------------------------------------------------------------------------
 TypeError                                 Traceback (most recent call last)
 <ipython-input-113-543c6addad42> in <module>
       1 for i in l1:
 ----> 2     temp_df = temp_df.append({'bc': i.get(['B1']['bc'],'N/A'),
       3                                 'bd': i.get(['B1']['bd'],'N/A'),
       4                                 'C1': i.get(['C1']['cb'],'N/A'),
       5                                 'D1': i.get(['D1'],'N/A')}, 

  TypeError: list indices must be integers or slices, not str

我做错了什么?

【问题讨论】:

    标签: python pandas list dictionary nested


    【解决方案1】:

    而不是i.get(['B1']['bc'],'N/A'),这是无效的python语法,使用i.get('B1', {}).get('bc', 'N/A')来获取嵌套键。也不要动态附加到熊猫数据框,它很慢。先追加到列表,然后将列表转换为数据框。

    lst = []
    for i in l1:
        lst.append({
            'bc': i.get('B1', {}).get('bc', 'N/A'),
            'bd': i.get('B1', {}).get('bd', 'N/A'),
            'cb': i.get('C1', {}).get('cb', 'N/A'),
            'D1': i.get('D1', 'N/A')
        })
    
    pd.DataFrame(lst)
    
           bc      bd                          cb      D1
    0  string  string  [[[123, 123], [123, 123]]]  string
    

    【讨论】:

      【解决方案2】:

      您可以参考@Psidom 对您的错误的回答,但是,为了实现您想要做的事情,您也可以使用json_normalize

      pd.json_normalize(l1).rename(columns={
          'B1.bc': 'bc',
          'B1.bd': 'bd',
          'C1.cb': 'cb'
      }).fillna('N/A')[['bc', 'bd', 'cb', 'D1']]
      

      【讨论】:

        猜你喜欢
        • 2015-07-24
        • 2021-11-28
        • 2022-01-07
        • 2021-03-20
        • 2019-10-03
        • 2020-05-21
        • 2020-01-21
        • 2023-03-20
        • 2020-06-30
        相关资源
        最近更新 更多