Синтаксический анализ сложного объекта JSON и извлечение массива

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

здравствуйте, я пытаюсь проанализировать этот объект json и получить только массив «результатов». массив «результаты» имеет свойства, поэтому набор элементов начинается с «property_id» и выглядит следующим образом. вот что я пробовал до сих пор;

 def process_similar_list(response_json):
    
dataframe_list = []

for l in response_json['data']['home']['related_homes']:

    _temp_df = pd.DataFrame.from_dict(l, orient='index').T

    dataframe_list.append(_temp_df)

return pd.concat(dataframe_list, axis=0, ignore_index=True, sort=False)
 

примерный список

и возвращаемая ошибка выглядит следующим образом;

 ---------------------------------------------------------------------------
 AttributeError                            Traceback (most recent call last)
 <ipython-input-122-c0a7104717a6> in <module>
  ----> 1 df_properties_similar_list = process_similar_list(response_json=property_similar_list)
  2 df_properties_similar_list

 <ipython-input-111-c54f548650dc> in process_similar_list(response_json)
 22 
 23         # convert each listing to dataframe
 ---> 24         _temp_df = pd.DataFrame.from_dict(l, orient='index').T
 25 
 26         # append to dataframe list for all listings

 ~anaconda3libsite-packagespandascoreframe.py in from_dict(cls, data, orient, dtype, columns)
 1235             if len(data) > 0:
 1236                 # TODO speed up Series case
 -> 1237                 if isinstance(list(data.values())[0], (Series, dict)):
  1238                     data = _from_nested_dict(data)
  1239                 else:

AttributeError: 'str' object has no attribute 'values'
 

Главное, я хочу отобразить этот массив результатов следующим образом
введите описание изображения здесь

Комментарии:

1. возможно ли опубликовать часть вашего ответа json в качестве образца?

Ответ №1:

Я считаю, что проблема в том, что вы слишком углубились в dict — Pandas DataFrame.from_dict(someDict, orient=’index’) ищет что-то вроде этого:

 import pandas as pd
someDict = {"someIndexLikeValue1":{"key1":"value11",
                    "key2":"othervalue12"},
"someIndexLikeValue2":{"key1":"value21",
                    "key2":"othervalue22"}}
print(pd.DataFrame.from_dict(someDict, orient="index"))

                        key1          key2
someIndexLikeValue1  value11  othervalue12
someIndexLikeValue2  value21  othervalue22

 

Чтобы создать однострочный фрейм данных с dict, который имеет внешний ключ (что, я думаю, вы и делаете), вам нужно что-то вроде:

 someOneRowDict = {"someOuterKey":{"someIndexLikeValue1":{"key1":"value11",
                    "key2":"othervalue12"}}}
print(pd.DataFrame.from_dict(someOneRowDict["someOuterKey"], orient="index"))

                       key1          key2
someIndexLikeValue1  value11  othervalue12
 

или, чтобы продвинуться на один уровень глубже, вам нужно преобразовать, как вы это сделали:

 print(pd.DataFrame.from_dict(someOneRowDict["someOuterKey"]["someIndexLikeValue1"], orient="index").T)

      key1          key2
0  value11  othervalue12
 

Итак, я думаю, что то, что вы сделали, эквивалентно

 print(pd.DataFrame.from_dict(someOneRowDict["someOuterKey"]["someIndexLikeValue1"]["key1"], orient="index"))
 

что выдает ошибку:

 AttributeError: 'str' object has no attribute 'values'