简体   繁体   中英

adding multiple columns to a dataframe using df.apply and a lambda function

I am trying to add multiple columns to an existing dataframe with df.apply and a lambda function. I am able to add columns one by one but not able to do it for all the columns together. My code



def get_player_stats(player_name):
    print(player_name)
    resp = requests.get(player_id_api + player_name)
    if resp.status_code != 200:
        # This means something went wrong.
        print('Error {}'.format(resp.status_code))

    result = resp.json()
    player_id = result['data'][0]['pid']

    resp_data = requests.get(player_data_api + str(player_id))
    if resp_data.status_code != 200:
        # This means something went wrong.
        print('Error {}'.format(resp_data.status_code))

    result_data = resp_data.json()

    check1 = len(result_data.get('data',None).get('batting',None))
#    print(check1)
    check2 = len(result_data.get('data',{}).get('batting',{}).get('ODIs',{}))
#    check2 = result_data.get(['data']['batting']['ODIs'],None)
#    print(check2)
    if check1 > 0 and check2 > 0:
        total_6s = result_data['data']['batting']['ODIs']['6s']
        total_4s = result_data['data']['batting']['ODIs']['4s']
        average = result_data['data']['batting']['ODIs']['Ave']
        total_innings = result_data['data']['batting']['ODIs']['Inns']
        total_catches = result_data['data']['batting']['ODIs']['Ct']
        total_stumps = result_data['data']['batting']['ODIs']['St']
        total_wickets = result_data['data']['bowling']['ODIs']['Wkts']
        print(average,total_innings,total_4s,total_6s,total_catches,total_stumps,total_wickets)    
        return np.array([average,total_innings,total_4s,total_6s,total_catches,total_stumps,total_wickets])
    else:
        print('No data for player')
        return '','','','','','',''


cols = ['Avg','tot_inns','tot_4s','tot_6s','tot_cts','tot_sts','tot_wkts']
for col in cols:
    players_available[col] = ''

players_available[cols] = players_available.apply(lambda x: get_player_stats(x['playerName']) , axis =1) 

I have tried adding columns explicitly to the dataframe but still i am getting an error

ValueError: Must have equal len keys and value when setting with an iterable

Can someone help me with this?

It's tricky, since in pandas the apply method evolve through versions.

In my version (0.25.3) and also the other recent versions, if the function returns pd.Series object then it works.

In your code, you could try to change the return value in the function:

return pd.Series([average,total_innings,total_4s,total_6s,
                  total_catches,total_stumps,total_wickets])

return pd.Series(['','','','','','',''])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM