最近爬了一些NBA球员的数据,想用pandas来做一下简单的分析一下,主要用到的函数就三个:apply,group by ,sum
处理思路:
- 对数据按照球员名字进行分组
- 统计每个球员每列数据的总和即2007年到2018年数据的合
- 对列进行作商
看一下球员数据:
数据格式是json格式最外层是detail 和 name字段detail保存的是球员的详细数据,name字段保存的是球员的名字。
处理过程:
加载数据
通过pandas的read_json()方法
import pandas as pd
data = pd.read_json('D:\\result.json',encoding='utf-8')
print(data)
但这并不是我们所需要的的格式
我们需要的数据应该是列名应该是data、team、games等字段而不是detail字段所以我们需要对数据做进一步处理。
使用apply函数:
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)第一个参数传一个函数这个函数需要自己实现,他可以对DataFrame对象的行或列进行操作,当axis=1 时,就会把一行数据作为Series的数据结构传入给自己实现的函数中,我们在函数中实现对Series的处理逻辑,apply函数会遍历DataFrame的每一行,然后将结果组合成一个Series返回。
f = lambda x: pd.Series(x)
tmp = data['detail'].apply(f)
name = data['name']
# print(name)
res = tmp.join(name)
print(res)
这样我们就实现了对数据的重新组装。
根据球员姓名对球员数据分组求和group by 和 sum函数
grouped = res.groupby(res['name'],group_keys=False)['games','gamesStarted','mins','fgm','fga','tpm','tpa','ftm','fta','offRebs','defRebs','rebs','assists','steals','blocks','turnovers','fouls','points'].sum()
print(grouped)
我们只对有用的字段进行分组
两列作商后删除原来的列,为了方便我们先copy一个副本
tmp_df = grouped.copy(deep=True)
#平均时长
tmp_df['avg_mins'] = tmp_df['mins']/tmp_df['gamesStarted']
#命中率
tmp_df['avg_hit_rate'] = tmp_df['fgm']/tmp_df['fga']
#三分命中率
tmp_df['three_pointers'] = tmp_df['tpm']/tmp_df['tpa']
#罚球命中率
tmp_df['free_throw'] = tmp_df['ftm']/tmp_df['fta']
#场均进攻
tmp_df['avg_attack'] = tmp_df['offRebs']/tmp_df['gamesStarted']
#场均防守
tmp_df['avg_defend'] = tmp_df['defRebs']/tmp_df['gamesStarted']
#场均篮板
tmp_df['avg_backboard'] = tmp_df['rebs']/tmp_df['gamesStarted']
#场均助攻
tmp_df['avg_assists'] = tmp_df['assists']/tmp_df['gamesStarted']
#场均抢断
tmp_df['avg_steal'] = tmp_df['steals']/tmp_df['gamesStarted']
#场均盖帽
tmp['avg_blocks'] = tmp_df['blocks']/tmp_df['gamesStarted']
#场均失误
tmp_df['avg_turnovers'] = tmp_df['turnovers']/tmp_df['gamesStarted']
#场均犯规
tmp_df['avg_fouls'] = tmp_df['fouls']/tmp_df['gamesStarted']
#场均得分
tmp_df['avg_points'] = tmp_df['points']/tmp_df['gamesStarted']
tmp_df.drop(['mins','fgm','fga','tpm','tpa','ftm','fta','offRebs','defRebs','rebs','assists','steals','blocks','turnovers','fouls','points'],axis=1,inplace=True)
最后将这个这个DataFrame保存成csv文件,使用pandas的to_csv()方法
tmp_df.to_csv(path_or_buf='E:\\NBA.csv',float_format='%.2f',index_label='name')