Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取字典值列表的列,并使用它们的值(而不是键)创建新列_Python_Pandas_Json Normalize - Fatal编程技术网

Python 如何获取字典值列表的列,并使用它们的值(而不是键)创建新列

Python 如何获取字典值列表的列,并使用它们的值(而不是键)创建新列,python,pandas,json-normalize,Python,Pandas,Json Normalize,我正在分析ProPublica发布的Facebook上的政治广告 我想分析一整列的'targets',但它的格式是,每个观察都是列表的dicts,以string的形式(例如“[{k1:v1},{k2:v2}]”) 我需要将每个“target”值分隔成列标题,每个相应的“segment”值成为该列中的一个值 或者,解决方案是创建一个函数,调用每行中的每个字典键,计算频率 这就是它作为输出的样子: NAge MinAge

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

我想分析一整列的
'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```