Превратите список словарей или кортежей в DataFrame. Действия - Столбец, Значение - строки - PullRequest
0 голосов
/ 16 октября 2019

Я делаю API-вызов в Facebook, и одно из полей - «действия», которое создает словарь, который я хотел бы разбить на отдельные столбцы DataFrame. Я видел несколько похожих вопросов, используя pd.Series (), чтобы отобразить их в отдельные столбцы или json.normalize (), но они точно не выполняют то, что я ищу.

Вот экспорт передЯ помещаю его в столбец данных:

[<AdsInsights> {
    "actions": [
        {
            "action_type": "landing_page_view",
            "value": "292"
        },
        {
            "action_type": "comment",
            "value": "13"
        },
        {
            "action_type": "onsite_conversion.post_save",
            "value": "6"
        },
        {
            "action_type": "link_click",
            "value": "874"
        },
        {
            "action_type": "post",
            "value": "1"
        },
        {
            "action_type": "post_reaction",
            "value": "393"
        },
        {
            "action_type": "post_engagement",
            "value": "96"
        },
        {
            "action_type": "page_engagement",
            "value": "96"
        },
        {
            "action_type": "omni_activate_app",
            "value": "5"
        },
        {
            "action_type": "omni_app_install",
            "value": "2"
        },
        {
            "action_type": "omni_add_to_cart",
            "value": "75"
        },
        {
            "action_type": "add_to_wishlist",
            "value": "14"
        },
        {
            "action_type": "omni_purchase",
            "value": "4"
        },
        {
            "action_type": "omni_search",
            "value": "12"
        },
        {
            "action_type": "omni_view_content",
            "value": "15"
        }
    ]

Затем я помещаю его в DF, но столбец становится действием, и он помещает все эти данные в одну строку, а затем повторяет их для каждого элемента. У меня возникли проблемы с разбиением action_type на заголовок столбца и значение в строке. Я получаю несколько строк этих наборов данных, когда создаю DF.

, когда я создаю фрейм данных, это выглядит так:

    df[ad] df[actions]
0   ad1     [{'action_type': 'landing_page_view', 'value':...
1   ad2     [{'action_type': 'landing_page_view', 'value':...
2   ad3     [{'action_type': 'landing_page_view', 'value':...

Я надеюсь получить:

    df[ad] df[landing_page_view] df[comment] ...etc
0   ad1     292                      13
1   ad2     100                      8 
2   ad3     80                       9 

Я пытался выбрать конкретные столбцы, которые я хотел сделать, но это не работает:

df = all of the raw data from the API call
df = pd.DataFrame(df)
actions = df['actions']
def setcolumn(dict, key): 

    if dict.has_key(key): 
        df['key'] = 'value' 
    else: 
        print ("Not present")

setcolumn(actions, 'landing_page_view')

, но это говорит о том, что у объекта серии нет атрибута has_key.

ценится любое направление!

1 Ответ

0 голосов
/ 16 октября 2019

Я немного отредактировал ваш результат API, потому что я не уверен, для чего предназначен тег в начале.

Решением является простой метод pandas, называемый from_records (), который преобразует список в фрейм данных. Вот некоторые ссылки:

import pandas as pd

# facebook API result as dictionary ... I removed the '<AdsInsights> ' at the beginning
list_facebook_api = {
    "actions": [
        {
            "action_type": "landing_page_view",
            "value": "292"
        },
        {
            "action_type": "comment",
            "value": "13"
        },
        {
            "action_type": "onsite_conversion.post_save",
            "value": "6"
        },
        {
            "action_type": "link_click",
            "value": "874"
        },
        {
            "action_type": "post",
            "value": "1"
        },
        {
            "action_type": "post_reaction",
            "value": "393"
        },
        {
            "action_type": "post_engagement",
            "value": "96"
        },
        {
            "action_type": "page_engagement",
            "value": "96"
        },
        {
            "action_type": "omni_activate_app",
            "value": "5"
        },
        {
            "action_type": "omni_app_install",
            "value": "2"
        },
        {
            "action_type": "omni_add_to_cart",
            "value": "75"
        },
        {
            "action_type": "add_to_wishlist",
            "value": "14"
        },
        {
            "action_type": "omni_purchase",
            "value": "4"
        },
        {
            "action_type": "omni_search",
            "value": "12"
        },
        {
            "action_type": "omni_view_content",
            "value": "15"
        }
    ]
}

# create a dataframe from the list inside the dictionary
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.from_records.html
# https://pbpython.com/pandas-list-dict.html
# https://stackoverflow.com/questions/44563707/how-to-create-pandas-dataframe-with-index-from-the-list-of-tuples
df = pd.DataFrame.from_records(list_facebook_api['actions'])

print(df.shape)

# print(df)
df

enter image description here

...