首页 > 解决方案 > 如何将字典解压成结构化的DataFrame

问题描述

我有一个包含供应商信息的数据框。其中有一个名为“属性”的列。该字段包含一个字典字典,每个字典都可能包含不同的键:对数据。我想将这些属性作为列标题解压缩到 DataFrame 中。

东风 =attributes companyName id 4 [{'attributeName': 'File Discount', 'attribute... Ace 130 13 [{'attributeName': 'Payment Terms', 'attribute... B66ks 240

一个示例属性单元格:

 [{'attributeName': 'File Discount',
  'attributeType': 'int',
  'attributeValue': '15'},
 {'attributeName': 'Returns',
  'attributeType': 'text',
  'attributeValue': 'Full SOR on all'}]

我希望它从“attributeName”创建一个 DF 列标题,并将值作为“attributeValue”。因此,在此示例中,它将返回“文件折扣”和“返回”的标题以及“15”和“全部 SOR”的值。

我如何最好地解决这个问题?

标签: pythonpandasdictionary

解决方案


attributeName您可以使用提取和值为每一行创建新字典,attributeValue并使用以下命令添加所有原始列join

a = [{'attributeName': 'File Discount',
  'attributeType': 'int',
  'attributeValue': '15'},
 {'attributeName': 'Returns',
  'attributeType': 'text',
  'attributeValue': 'Full SOR on all'}]

b = [{'attributeName': 'File',
     'attributeType': 'int',
     'attributeValue': '48'}]

df = pd.DataFrame({'companyName':['Ace','B66ks'],
                   'attributes':[a,b],
                   'id':[130,240]})
print (df)
  companyName                                         attributes   id
0         Ace  [{'attributeName': 'File Discount', 'attribute...  130
1       B66ks  [{'attributeName': 'File', 'attributeType': 'i...  240

L = [{y.get('attributeName'):y.get('attributeValue') for y in v} 
      for k, v in df.pop('attributes').items()]
print (L)
[{'File Discount': '15', 'Returns': 'Full SOR on all'}, {'File': '48'}]

df1 = pd.DataFrame(L, index=df.index).join(df)
print (df1)
  File File Discount          Returns companyName   id
0  NaN            15  Full SOR on all         Ace  130
1   48           NaN              NaN       B66ks  240

推荐阅读