skip to Main Content

I have a data from Facebook Insights API and some columns in the data look like this:

"[{'action_type': 'link_click', 'value': '812'}, {'action_type':'page_engagement','value':'823'}, {'action_type': 'post_engagement', 'value': '823'}, {'action_type':'post', 'value': '1'}, {'action_type': 'post_reaction', 'value': '10'}, {'action_type':'landing_page_view', 'value': '143'}]"]

I’m trying to put the data here in a dataframe, but there is a different campaign in each row and I need to add more than one row for a campaign here, so for campaign a, link click: 812 is also post_engag for campaign a. 823 and these need to be in separate columns for that campaign, so the data needs to be separated as follows:

link_click    page_engagement   post_engagement  post   post_reaction   landing_page_view
   812              823              823          1         10               143

I have a method but I get an error:

def function2(df, col_name, filter="action_type",
                        which_fields=''):
    xx = df[xcol].apply(pd.Series).merge(df["index"], right_index=True, left_index=True).melt
    xx2 = xx[col_name].apply(pd.Series).merge(xx["index"], right_index=True, left_index=True)
    xx2 = xx2.loc[xx2[filter] == which_fields, ["value", "index"]]
    xx2.rename(columns={"value": col_name + '_' + which_fields.replace('.','_')},inplace=True)

    return xx2

The error I get is:

    raise KeyError(key) from err
KeyError: 'action_type'

How can I do that with Python ?

2

Answers


  1. Try:

    lst = [
        {"action_type": "link_click", "value": "812"},
        {"action_type": "page_engagement", "value": "823"},
        {"action_type": "post_engagement", "value": "823"},
        {"action_type": "post", "value": "1"},
        {"action_type": "post_reaction", "value": "10"},
        {"action_type": "landing_page_view", "value": "143"},
    ]
    
    df = pd.DataFrame([{d.get("action_type"): d.get("value") for d in lst}])
    print(df)
    

    Prints:

      link_click page_engagement post_engagement post post_reaction landing_page_view
    0        812             823             823    1            10               143
    
    Login or Signup to reply.
  2. You can use ast.literal_eval and the DataFrame constructor:

    from ast import literal_eval
    
    out = pd.DataFrame(literal_eval(s)).set_index('action_type').T
    

    output:

    action_type link_click page_engagement post_engagement post post_reaction landing_page_view
    value              812             823             823    1            10               143
    

    used input:

    s = "[{'action_type': 'link_click', 'value': '812'}, {'action_type':'page_engagement','value':'823'}, {'action_type': 'post_engagement', 'value': '823'}, {'action_type':'post', 'value': '1'}, {'action_type': 'post_reaction', 'value': '10'}, {'action_type':'landing_page_view', 'value': '143'}]"
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search