Итерировать через JSON в Pandas - PullRequest
0 голосов
/ 18 июня 2020

введите здесь описание изображения

У меня есть строка json, которая выглядит примерно так:

[
  {
    'DigitalAsset': {
      'URL': **SOMEIMAGEURL**
      'DigitalAssetType': {
        'DigitalAssetTypeName': 'Building Image'
      },
      'URLType': {
        'URLTypeName': 'Secure URL'
      }
    },
    'PropertyDigitalAssetID': 18283747,
  },

Я хочу извлечь URL-адрес изображения в pandas и написали следующий код для достижения этого

 df['url'] = df['PropertyDigitalAsset'].apply(lambda x: next(iter([a[
                                                                        'DigitalAsset'] for a in x if
                             a['DigitalAssetType']['DigitalAssetTypeName'] == 'Building Image']),
                       None)
        if type(x) == list else None)

Но я не уверен, что пошло не так, что это не работает, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 18 июня 2020

Мне удалось извлечь URL-адрес, используя приведенный ниже код. Обратите внимание, что мне пришлось сделать некоторые предположения о том, может ли список содержать более одного JSON (следовательно, более одного URL-адреса).

Вы можете спокойно игнорировать строки, которые устанавливают фрейм данных, поскольку у вас уже должно быть ваш сделал, они мне нужны для проверки результатов.

import pandas as pd

def geturls(image_list):
    URL_List = []
    for image in image_list:
        if image['DigitalAsset']['DigitalAssetType']['DigitalAssetTypeName'] == 'Building Image':
            URL_List.append(image['DigitalAsset']['URL'])

    return URL_List

Json_List_A = [
  {'DigitalAsset': {
    'URL': 'Random URL 1',
    'DigitalAssetType': {
        'DigitalAssetTypeName': 'Building Image'
      },
     'URLType': {
        'URLTypeName': 'Secure URL'
      }
    },
    'PropertyDigitalAssetID': 18283747,
  },
  {'DigitalAsset': {
    'URL': 'Random URL 2',
    'DigitalAssetType': {
        'DigitalAssetTypeName': 'Not a Building'
      },
     'URLType': {
        'URLTypeName': 'Secure URL'
      }
    },
    'PropertyDigitalAssetID': 13747,
  }
]


Json_List_B = [
  {
    'DigitalAsset': {
      'URL': 'Random URL A',
      'DigitalAssetType': {
        'DigitalAssetTypeName': 'Building Image'
      },
      'URLType': {
        'URLTypeName': 'Secure URL'
      }
    },
    'PropertyDigitalAssetID': 82747,
  },
    {
    'DigitalAsset': {
      'URL': 'Random URL B',
      'DigitalAssetType': {
        'DigitalAssetTypeName': 'Building Image'
      },
      'URLType': {
        'URLTypeName': 'Secure URL'
      }
    },
    'PropertyDigitalAssetID': 1827,
  }
  ]


data = {'PropertyID':  ['762', '771'],
        'PropertyDigitalAsset': [Json_List_A, Json_List_B],
        }

df = pd.DataFrame (data, columns = ['PropertyID','PropertyDigitalAsset'])

df['url'] = df['PropertyDigitalAsset'].apply(lambda x: geturls(x))

print(df)

Первые несколько строк настроены так, чтобы показать, что он работает с образцами данных. (если ваши данные отличаются от тех, которые я предполагал, оставьте комментарий, и я могу изменить функции по мере необходимости)

Я создал вспомогательную функцию для извлечения URL-адресов из каждой строки и позволил pandas применить функция сделает все остальное.

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