Python 如何获取字典值列表的列,并使用它们的值(而不是键)创建新列
我正在分析ProPublica发布的Facebook上的政治广告 我想分析一整列的Python 如何获取字典值列表的列,并使用它们的值(而不是键)创建新列,python,pandas,json-normalize,Python,Pandas,Json Normalize,我正在分析ProPublica发布的Facebook上的政治广告 我想分析一整列的'targets',但它的格式是,每个观察都是列表的dicts,以string的形式(例如“[{k1:v1},{k2:v2}]”) 我需要将每个“target”值分隔成列标题,每个相应的“segment”值成为该列中的一个值 或者,解决方案是创建一个函数,调用每行中的每个字典键,计算频率 这就是它作为输出的样子: NAge MinAge
'targets'
,但它的格式是,每个观察都是列表的dicts
,以string
的形式(例如“[{k1:v1},{k2:v2}]”
)
我需要将每个“target”
值
分隔成列标题,每个相应的“segment”
值
成为该列中的一个值
或者,解决方案是创建一个函数,调用每行中的每个字典键,计算频率
这就是它作为输出的样子:
NAge MinAge Retargeting Region ... Interest Location Granularity Country Gender NAge MinAge Retargeting Region ... Interest Location Granularity Country Gender
0 21 and older 21 people who may be similar to their customers the United States ... NaN NaN NaN NaN
1 18 and older 18 NaN NaN ... Republican Party (United States) country the United States NaN
2 18 and older 18 NaN NaN ... NaN country the United States women```
Reddit上有人发布了此解决方案:
导入json
对于id,枚举中的行(df.targets):
对于json.loads(行)中的d:
df.loc[id,d['target']]=d['segment']
df=df.drop(列=['targets'])
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在里面
2对于id,枚举中的行(df.targets):
3表示json.loads(行)中的d:
---->4 df.loc[id,d['target']]=d['segment']
5.
6 df=df.drop(列=['targets'])
KeyError:'段'
def fix()
未矢量化,即使如此,应用到文件中的222186行只需591毫秒
- 使用
.fillna()
替换列中的NaN
,否则literal\u eval
将导致ValueError:格式错误的节点或字符串:NaN
- 将
'null'
替换为'None'
,否则literal\u eval
将导致ValueError:格式错误的节点或字符串:
'targets'
行中的值都是str
类型,可以通过ast.literal\u eval
转换为列表
def fix()
迭代列表中的目录
,然后仅使用值
在目录
中创建键值
对,从而将目录
的每个列表
转换为单个目录
。
- 空的
列表
替换为空的目录
,这是.json\u normalize()
处理列所必需的
pandas.json\u normalized()
可以轻松地在列上使用
- 另请参阅,了解使用相同数据的替代方法。
- 如中所示,当使用
.groupby
和聚合.count()
将'targets'
列展开(整齐的格式)时,实际上更容易获得所有唯一计数
将熊猫作为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列表
def固定(col):
dd=dict()
对于col中的d:
值=列表(d.值())
如果len(值)==2:
dd[值[0]]=值[1]
返回dd
#将函数应用于目标
df.targets=df.targets.apply(修复)
#显示(df.targets.head())
目标
0{'Age':'18岁及以上,'MinAge':'18','Segment':'Multicultural African American(美国)。','Region':'the United States'}
1{‘年龄’:‘45岁及以上’,‘MinAge’:‘45’,‘重新定位’:‘可能与其客户相似的人’,‘地区’:‘美国’}
2{‘年龄’:‘18岁及以上’,‘米纳奇’:‘18’,‘地区’:‘德克萨斯’}
3 {}
4{‘兴趣’:‘华盛顿邮报’,‘性别’:‘男性’,‘年龄’:‘34至49’,‘米纳奇’:‘34’,‘马克萨奇’:‘49’,‘地区’:‘美国’}
#规范化目标列
normalized=pd.json\u normalize(df.targets)
#如果需要,将标准化后的数据连接回df
df=df.join(normalized.drop)(列=['targets'])
标准化
宽格式,用于示例数据
#显示(normalized.head())
年龄最小分段区域重定目标兴趣性别最大年龄
0 18岁及18岁以上的多文化亲和力:非裔美国人(美国)。美国南部
1 45岁及45岁以上的美国人,他们可能与其客户相似
2 18岁及18岁以上德克萨斯州南部
3楠楠楠楠楠楠楠楠
4 34至49 34南美国南华盛顿邮报男子49
标准化
宽格式,用于完整数据集
- 从
.info()
中可以看到,目标
列包含许多不同的键
,但并非所有行都包含所有的键
NAge MinAge Retargeting Region ... Interest Location Granularity Country Gender NAge MinAge Retargeting Region ... Interest Location Granularity Country Gender
0 21 and older 21 people who may be similar to their customers the United States ... NaN NaN NaN NaN
1 18 and older 18 NaN NaN ... Republican Party (United States) country the United States NaN
2 18 and older 18 NaN NaN ... NaN country the United States women```