从Dataframe中的JSON列中提取特定值

2024-05-17 19:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我将json转换为数据帧

ad_data = '{
   "data":[
      {
         "impressions":"11111",
         "spend":"123",
         "conversions":[
            {
               "action_type":"start_trial_total",
               "value":"6"
            },
            {
               "action_type":"subscribe_mobile_app",
               "value":"3"
            }
         ],
         "outbound_clicks_ctr":[
            {
               "action_type":"outbound_click",
               "value":"1.869306"
            }
         ],
         "date_start":"2020-01-23",
         "date_stop":"2020-01-23"
      },
      {
         "impressions":"22222",
         "spend":"321",
            {
               "action_type":"start_trial_total",
               "value":"6"
            }
         ],
         "outbound_clicks_ctr":[
            {
               "action_type":"outbound_click",
               "value":"2.328902"
            }
         ],
         "date_start":"2020-01-24",
         "date_stop":"2020-01-24"
      }
   ]
}'

df = pd.DataFrame(ad_data['data'])

所以我得到了数据帧

^{tb1}$

现在,我只想从subscribe\u mobile\u app存在的conversions列中提取值,在其他情况下,插入0并获得如下表

^{tb2}$

我怎样才能在熊猫身上得到这样的结果

在使用循环将JSON转换为Dataframe之前,我还尝试提取值,并将其添加到列表中,然后将其作为新列添加到Dataframe中,但这个计划对我也不起作用

subscribe = []
for i in ad_data['data']:
    for sub in i['conversions']:
        if sub['action_type'] == 'subscribe_mobile_app':
            subscribe.append(sub['value'])
        else:
            subscribe.append(None)

结果是这样的:

[None,3,None, None...]

Tags: 数据noneappdatadatevalueoutboundtype
2条回答

因为数据帧的conversions列包含要操作的词典列表。 您可以创建一个单独的函数,该函数可以接受这些列表作为参数,然后在这些列表中的字典中进行检查(如果其中有subscribe_mobile_app),然后相应地返回值:

def subscribe_mobile_app_values(lst):
     val = 0
     for i in lst:
         if i["action_type"] == "subscribe_mobile_app":
             val = i["value"]
             break
     return val

然后将此函数应用于数据帧中的conversions列:

df['conversions'] = df['conversions'].apply(subscribe_mobile_app_values)

尝试:

import ast

result = []
for i in df.conversions.values:
    f = False
    for k in ast.literal_eval(i):
        if 'subscribe_mobile_app' in k.values():
            result.append(k['value'])
            f = True
            break
    if not f:
        result.append(0)

df.conversions = result

相关问题 更多 >