【问题标题】:Merge multiple Json strings with same ID合并多个具有相同 ID 的 Json 字符串
【发布时间】:2020-07-28 07:05:00
【问题描述】:

我有一个结构如下 [1] 的 Json 文件,您可以看到多个关键字附加到一篇报纸文章。我想将 Json 规范化为这样的结构(DataFrame)[2]。我已经用 json_normalize 尝试过,但没有按预期工作,还做了一些多索引,但我无法将结果保存为 csv 格式,这使一切变得更加复杂。我想要的是获取结构中的数据以对其进行分析并根据提取的关键字将整篇文章标记为正面或负面。

    [2]
    ╔═══════════════╦════════════╦═══════════════╗
    ║ url           ║ date       ║ entities.name ║
    ║ http://ww.... ║ 2018-12-31 ║ 2018          ║
    ║ --------------║------------║ Bill Cosby    ║
    ║               ║            ║ Actress       ║
    ║               ║            ║ ...           ║
    ╚═══════════════╩════════════╩═══════════════╝  




 [1]
{'lang': 'ENGLISH',
        'date': '2018-12-31T23:46:18Z',
     'url': 'http://www.newschannel6now.com/2018/12/31/cosby-kanye-box-office-diversity-biggest-entertainment-stories/',
     'entities': [{'avgSalience': 1,
       'wikipediaEntry': '2018',
       'type': 'DATE',
       'numMentions': 4,
       'name': '2018',
       'nameNorm': '2018'},
      {'wikipediaEntry': 'Actor',
       'type': 'COMMON',
       'numMentions': 4,
       'avgSalience': 0.72,
       'nameNorm': 'actres',
       'name': 'Actress'},
      {'wikipediaEntry': 'Bill Cosby',
       'type': 'PROPER',
       'numMentions': 2,
       'avgSalience': 0.57,
       'nameNorm': 'bill cosby',
       'name': 'Bill Cosby'},
    {'name': 'music superstar',
       'nameNorm': 'music superstar',
       'avgSalience': 0.02,
       'type': 'COMMON',
       'numMentions': 1}]}

编辑

我通过使用 group by 并将值加入一列进行管理:

df.groupby(['url','date'], as_index=False).agg({
    'name': lambda x: ', '.join(x),
    'numMentions': lambda x: ', '.join(map(str,x)),
    'avgSalience':lambda x: ', '.join(map(str,x))
})

【问题讨论】:

  • @sammywemmy 看到 [2] 这是我预期的 DataFrame 输出

标签: json pandas csv dataframe


【解决方案1】:

让我知道这是否符合您的用例:

json_normalize

from pandas import json_normalize
json_normalize(data,'entities',['url','date']).filter(['url','date','name'])

              url                                           date           name
0   http://www.newschannel6now.com/2018/12/31/cosb...   2018-12-31T23:46:18Z    2018
1   http://www.newschannel6now.com/2018/12/31/cosb...   2018-12-31T23:46:18Z    Actress
2   http://www.newschannel6now.com/2018/12/31/cosb...   2018-12-31T23:46:18Z    Bill Cosby
3   http://www.newschannel6now.com/2018/12/31/cosb...   2018-12-31T23:46:18Z    music superstar

其他选项:

我依靠一个名为nested_lookup 的库来提取数据。

from nested_lookup import nested_lookup

keys = ['url','date','name']

res = [nested_lookup(key,data) for key in keys]
df = pd.concat([pd.DataFrame(ent) for ent in res],axis=1)
df = df.set_axis(['url','date', 'entities.name'],axis='columns')

df

     url                                                   date   entities.name
0   http://www.newschannel6now.com/2018/12/31/cosb...   2018-12-31T23:46:18Z    2018
1                    NaN                                      NaN   Actress
2                    NaN                                      NaN   Bill Cosby
3                    NaN                                      NaN   music superstar

注意 json_normalize 是如何将每一行与 url 关联起来的,而在 nested_lookup 选项中,NaN 被传播。

【讨论】:

  • 嘿,谢谢您的回复,但这不是我要找的,我想要的是没有 NaN 的第二个选项,我需要将 entity.name 值链接到 url 列中的一行,因为它们都是从报纸文章中提取的关键词。
  • 您必须编辑 [2] 以捕获您想要的内容并使其更清晰,因为目前看来,您似乎想要在各个行上显示 entity.name。你可能希望它是2018, Actress, Bill Cosby, music superstar
  • 没错,我要重新格式化它,谢谢你告诉我。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多