Объединить несколько Json строк с одинаковым идентификатором - PullRequest
1 голос
/ 15 апреля 2020

У меня есть файл Json, который структурирован, как показано ниже [1], так как вы можете видеть несколько ключевых слов, прикрепленных к одной газетной статье. Я хочу нормализовать 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}]}

РЕДАКТИРОВАТЬ

Мне удалось с помощью группы и объединяя значения в один столбец:

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))
})

1 Ответ

1 голос
/ 15 апреля 2020

Дайте мне знать, если это соответствует вашему варианту использования:

с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...