pandas 分析NBA球员常规赛2007年到2018年常规赛数据

最近爬了一些NBA球员的数据,想用pandas来做一下简单的分析一下,主要用到的函数就三个:apply,group by ,sum

处理思路:
  1. 对数据按照球员名字进行分组
  2. 统计每个球员每列数据的总和即2007年到2018年数据的合
  3. 对列进行作商

看一下球员数据:
在这里插入图片描述
数据格式是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')

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值