Python 如何将包含DICT列表的pandas列拆分为每个键的单独列

Python 如何将包含DICT列表的pandas列拆分为每个键的单独列,python,pandas,json-normalize,Python,Pandas,Json Normalize,我正在分析ProPublica发布的Facebook上的政治广告 这就是我的意思。 我有一整列的目标,我想分析,但它的格式在一个非常难以接近的方式为我的技能水平的人 这仅来自1个单元: 还有一个: [{target:“NAge”,“segment:“18岁及以上”},{“target:“位置类型”,“segment:“HOME”},{“target:“兴趣”,“segment:“西班牙裔文化”},{“target:“兴趣”,“segment:“共和党(美国)”},{“位置粒度”,“segmen

我正在分析ProPublica发布的Facebook上的政治广告

这就是我的意思。 我有一整列的目标,我想分析,但它的格式在一个非常难以接近的方式为我的技能水平的人

这仅来自1个单元:

还有一个:
[{target:“NAge”,“segment:“18岁及以上”},{“target:“位置类型”,“segment:“HOME”},{“target:“兴趣”,“segment:“西班牙裔文化”},{“target:“兴趣”,“segment:“共和党(美国)”},{“位置粒度”,“segment:“国家”},{“target:“国家”,“segment:“美国”},{“目标”:“MinAge”,“segment”:18}]

我需要做的是分离每个“目标”项,使其成为列标签,并使每个对应的“段”成为该列中的一个可能值

或者,解决方案是创建一个函数来调用每行中的每个字典键来计算频率吗?

  • 这些列是
    目录的
    列表。
    
    • 使用
      pandas.explode()
      可以将
      列表中的每个
      dict
      移动到单独的列中
    • 通过使用
      pandas.json\u normalize()
      dicts的列转换为数据帧,其中键是列标题,值是观察值
  • 使用
    .drop()
    删除不需要的列
  • 如果列包含作为字符串的DICT列表(例如,
    “[{key:value}]”
    ),请参阅中的内容,并使用:
    • df.col2=df.col2.apply(literal\u eval)
      ,使用ast导入literal\u eval的
将熊猫作为pd导入
#创建示例数据帧
df=pd.DataFrame({'col1':['x','y'],'col2':[[{“target”:“NAge”,“segment”:“21及以上”},{“target”:“MinAge”,“segment”:“21”},{“target”:“重定目标”,“segment”:“可能与其客户相似的人”},{“target”:“Region”,“segment”:“美国”},{“target”:“NAge”,“segment”:“18及以上”},{“target,“段”:“家”},{“目标”;“兴趣”;“西班牙文化”},{“目标”;“兴趣”;“段”;“共和党(美国)”},{“目标”;“地点粒度”;“段”;“国家”},{“目标”;“国家”;“美国”},{“目标”;“米纳奇”;“段”;“18}]})
#显示(df)
可乐可乐
0 x[{'target':'NAge','segment':'21及以上版本'},{'target':'MinAge','segment':'21'},{'target':'Retargeting','segment':'可能与其客户相似的人'},{'target':'Region','segment':'the United States'}]
1 y[{'target':'NAge','segment':'18及以上'},{'target':'Location Type','segment':'HOME'},{'target':'Interest','segment':'Hispanic culture'},{'target':'Republican Party(美国)',{'target':'Location Granularity','segment':'country'},{'target,{'target':'MinAge','segment':18}]
#使用“分解”为列表中的每个dict指定一个单独的行
df=df.explode('col2')。重置索引(drop=True)
#规范化DICT列,重新连接到剩余的数据帧列,并删除不需要的列
df=df.join(pd.json_normalize(df.col2)).drop(columns=['col2']))
显示(df)
获取
计数
  • 如果目标是获得每个
    'target'
    和相关
    'segment'
counts=df.groupby(['target','segment']).count()
更新
  • 此更新针对完整文件实施
将熊猫作为pd导入
从ast导入文字值
#加载文件
df=pd.read\u csv('en-US.csv')
#将NAN替换为“[]”,否则文字评估将出错
df.targets=df.targets.fillna(“[]”)
#将null替换为None,否则literal_eval将出错
df.targets=df.targets.str.replace('null','None')
#将字符串转换为dict列表
df.targets=df.targets.apply(文本值)
#使用“分解”为列表中的每个dict指定一个单独的行
df=df.explode('targets')。重置索引(drop=True)
#json_规范化需要使用{}填充NA
df.targets=df.targets.fillna({i:{}表示df.index}中的i)
#规范化DICT列,重新连接到剩余的数据帧列,并删除不需要的列
normalized=pd.json\u normalize(df.targets)
#数一数
计数=标准化的.groupby(['target','segment'])。segment.count()。重置索引(name='counts')

查看更新以获取计数。
   col1                target                                       segment
0     x                  NAge                                  21 and older
1     x                MinAge                                            21
2     x           Retargeting  people who may be similar to their customers
3     x                Region                             the United States
4     y                  NAge                                  18 and older
5     y         Location Type                                          HOME
6     y              Interest                              Hispanic culture
7     y              Interest              Republican Party (United States)
8     y  Location Granularity                                       country
9     y               Country                             the United States
10    y                MinAge                                            18