Как пройти по спискам, содержащим словарь? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь просмотреть JSON данные, перенесенные в Dataframe.

Вот код, используемый для переноса данных:

df = json_normalize(data['PatentBulkData'])

Каждая серия Dataframe представляет собой список. Каждый список содержит список словарей, как показано ниже.

Например, вот список словарей, возвращаемых, когда я ввожу df['prosecutionHistoryDataBag.prosecutionHistoryData'][i]:

[{'eventCode': 'PG-ISSUE',
  'eventDate': '2020-04-23',
  'eventDescriptionText': 'PG-Pub Issue Notification'},
 {'eventCode': 'RQPR',
  'eventDate': '2020-01-02',
  'eventDescriptionText': 'Request for Foreign Priority (Priority Papers May Be Included)'},
 {'eventCode': 'M844',
  'eventDate': '2020-01-03',
  'eventDescriptionText': 'Information Disclosure Statement (IDS) Filed'},
 {'eventCode': 'M844',
  'eventDate': '2020-01-02',
  'eventDescriptionText': 'Information Disclosure Statement (IDS) Filed'},
 {'eventCode': 'COMP',
  'eventDate': '2020-02-04',
  'eventDescriptionText': 'Application Is Now Complete'}]

Тогда df['prosecutionHistoryDataBag.prosecutionHistoryData'][i][j] вернет словарь:

{'eventCode': 'PG-ISSUE',
 'eventDate': '2020-04-23',
 'eventDescriptionText': 'PG-Pub Issue Notification'}

Я хотел бы перебрать каждую запись в df['prosecutionHistoryDataBag.prosecutionHistoryData'], чтобы идентифицировать строки, содержащие определенную c строку в 'eventDescriptionText'.

В приведенном выше примере df['prosecutionHistoryDataBag.prosecutionHistoryData'] - это серия, df['prosecutionHistoryDataBag.prosecutionHistoryData'][i] - это список, а ['prosecutionHistoryDataBag.prosecutionHistoryData'][i][j] - словарь.

Я хотел бы сначала выполнить итерацию по списку - и для каждого списка перебирать словарь, чтобы увидеть, ' eventDescriptionText 'содержит определенную строку c.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Если я правильно понял ваш вопрос, то

df['prosecutionHistoryDataBag.prosecutionHistoryData']

на самом деле является списком, элементами которого являются списки словарей. См. Также мой комментарий выше. Если это так, то скучный способ:

lst = df['prosecutionHistoryDataBag.prosecutionHistoryData']
for dicts in lst:
    for d in dicts:
        if d['eventDescriptionText'] == 'SOME TEXT YOU SEARCH FOR':
            code = d['eventCode']
            date = d['eventDate']
            # Do something with code and date.

Теперь вы можете сгладить этот список списков и использовать генератор :

lst = df['prosecutionHistoryDataBag.prosecutionHistoryData']
for d in (d for dicts in lst for d in dicts):
    if d['eventDescriptionText'] == 'SOME TEXT YOU SEARCH FOR':
        code = d['eventCode']
        date = d['eventDate']
        # Do something with code and date.

Затем поместите тест в генератор списков-сглаживаний, чтобы сделать код менее читабельным:

lst = df['prosecutionHistoryDataBag.prosecutionHistoryData']
for code, date in ((d['eventCode'], d['eventDate']) for dicts in lst for d in dicts if d['eventDescriptionText'] == 'SOME TEXT YOU SEARCH FOR'):
    # Do something with code and date.

Функция filter () не делает здесь не очень помогает с удобочитаемостью

for code, date in ((d['eventCode'], d['eventDate']) for d in filter(lambda d: d['eventDescriptionText'] == 'SOME TEXT YOU SEARCH FOR', (d for dicts in lst for d in dicts))):
    # Do something with code and date.        

, но другие itertools или more-itertools могут быть полезны (например, flatten () функция).

0 голосов
/ 14 июля 2020

Попробуйте использовать приведенный ниже код.

for lst in df['prosecutionHistoryDataBag.prosecutionHistoryData']:
    for I in lst:
        if I.get("eventDescriptionText").find(your_string) != -1:
            # do something
            pass
...