Python 如何将包含DICT列表的pandas列拆分为每个键的单独列
我正在分析ProPublica发布的Facebook上的政治广告 这就是我的意思。 我有一整列的目标,我想分析,但它的格式在一个非常难以接近的方式为我的技能水平的人 这仅来自1个单元: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
还有一个:
[{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