Как перейти в dataframe из вложенного ответа json, поступающего из api

#python #list #dataframe

#python #Список #dataframe

Вопрос:

 {
    "reviews": [
        {
            "reviewId": "12a3",
            "authorName": "Muhammad Arifin",
            "comments": [
                {
                    "userComment": {
                        "text": "tsangat terbantu👍",
                        "lastModified": {
                            "seconds": "1606819245",
                            "nanos": 835000000
                        },
                        "starRating": 5,
                        "reviewerLanguage": "id",
                        "device": "1601",
                        "androidOsVersion": 23,
                        "appVersionCode": 20365,
                        "appVersionName": "5.2.73",
                        "deviceMetadata": {
                            "productName": "1601 (1601)",
                            "manufacturer": "Vivo",
                            "deviceClass": "FORM_FACTOR_PHONE",
                            "nativePlatform": "ABI_ARM64_V8,ABI_ARM_V7,ABI_ARM",
                            "cpuModel": "MT6750",
                            "cpuMake": "Mediatek"
                        }
                    }
                },
                {
                    "developerComment": {
                        "text": "Terima kasih sudah berbagi, kami sangat senang menjadi bagian dalam pejalanan travel anda!",
                        "lastModified": {
                            "seconds": "1606818598",
                            "nanos": 722000000
                        }
                    }
                }
            ]
        }
    ]
    "tokenPagination": {
        "nextPageToken": "abc"
    }
}
 

Я хочу, чтобы имя столбца было таким, как
reviewId, AuthorName, userComment_text, userComment_lastModified, StarRating , deviceMetadata.manufacturer, developerComment.text

Я пробовал это:

 df=pd.json_normalize(fetch_reviews_response, record_path="reviews")
 

но он создает только столбец reviewId, AuthorName и comments

Ответ №1:

Пожалуйста, попробуйте это репозиторий и посмотрите, сработает ли это.

Для достижения этой цели используются рекурсивные функции. Функция в ‘json_to_csv.py ‘может быть легко перенесен для вашего использования путем преобразования плоского результата json в фрейм данных, просто загрузив его с помощью ‘pandas.read_json’.

Ответ №2:

Сначала я реорганизовал файл json, как показано ниже:

     {
"reviews": {

    "reviewId": "12a3",
    "authorName": "Muhammad Arifin",
    "comments": {
        "userComment": {
                "text": "tsangat terbantu👍",
                "lastModified": {
                    "seconds": "1606819245",
                    "nanos": 835000000
                },
                "starRating": 5,
                "reviewerLanguage": "id",
                "device": "1601",
                "androidOsVersion": 23,
                "appVersionCode": 20365,
                "appVersionName": "5.2.73",
                "deviceMetadata": {
                    "productName": "1601 (1601)",
                    "manufacturer": "Vivo",
                    "deviceClass": "FORM_FACTOR_PHONE",
                    "nativePlatform": "ABI_ARM64_V8,ABI_ARM_V7,ABI_ARM",
                    "cpuModel": "MT6750",
                    "cpuMake": "Mediatek"
                }
            },

            "developerComment": {
                "text": "Terima kasih sudah berbagi, kami sangat senang menjadi bagian dalam pejalanan travel anda!",
                "lastModified": {
                    "seconds": "1606818598",
                    "nanos": 722000000
                }
            }
        }


,
"tokenPagination": {
    "nextPageToken": "abc"
}
}
}
 

Затем в файле python я применил некоторые функции pandas для управления фреймом данных.

 import pandas as pd

df = pd.read_json("data.json")
df['reviewId'] = df['reviews']['reviewId']
df['authorName'] = df['reviews']['authorName']
df['userComment_text'] = df['reviews']['comments']['userComment']['text']
df['userComment_lastModified'] = df['reviews']['comments']['userComment']['lastModified']['seconds']
df['starRating'] = df['reviews']['comments']['userComment']['starRating']
df['deviceMetadata.manufacturer'] = df['reviews']['comments']['userComment']['deviceMetadata']['manufacturer']
df['developerComment.text'] = df['reviews']['comments']['developerComment']['text']



print(df.head())
 

И вот мой вывод:

                                                            reviews  ...                              developerComment.text
authorName                                         Muhammad Arifin  ...  Terima kasih sudah berbagi, kami sangat senang...
comments         {'userComment': {'text': ' sangat terbantu👍', ...  ...  Terima kasih sudah berbagi, kami sangat senang...
reviewId                                                      12a3  ...  Terima kasih sudah berbagi, kami sangat senang...
tokenPagination                           {'nextPageToken': 'abc'}  ...  Terima kasih sudah berbagi, kami sangat senang...
 

Между тем, вы можете изменять строки по своему усмотрению. Я не редактировал их, поскольку вы не предоставили никакой информации о строках.

Я надеюсь, что это сработает для вас

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

1. вложенная часть массива создает проблему. «комментарий»: [ { }]