我得到了一些奇幻的足球数据,我正在努力解决它,以便我可以稍后申请,这是scikit-learn的全部力量。
我在mysql数据库上有它,然后我用pd.read_sql进入了一个数据帧。数据框的所有行都是特定玩家的游戏,每列包含红牌,黄牌,助攻,干净的纸张等统计信息。这将导致每个玩家有多行,每个游戏都有一行。
我的问题是,如果总结起来,其中一些统计数据更有意义,然后除以分钟数,比如目标,助攻等。其他的,例如名称,团队和价值,只有获得最新价值才有意义。
因此,我想要做的是一个新的数据帧,其中每个玩家都有一行。有些列将是给定玩家的统计数据的总和,而其他列将只是该玩家的最后一个值。
我找到了一种非常难看的方法,但总和计算错误,而且非常混乱。我仍然是python的新手,所以所有的帮助都表示赞赏。 这样做的最佳方式是什么?
一些数据(刚刚制作但格式相同):
在这种情况下,每一行都是给定玩家的一个游戏,Szczesny和Koscielny。分钟,目标和助攻等栏目我想对所有比赛进行总结,但其他比赛,如价值和名称,我只想保留最后一个值。
最终结果是:
到目前为止
代码:
import pandas as pd
import mysql.connector
mysql_conn = mysql.connector.connect(user='user', password = 'pass',database='bpl')
#original dataframe
df_playerstats = pd.read_sql('select * from player_stats;', con=mysql_conn)
#index of columns meant to be summed on the original data frame(df_playerstats)
column_sumidx = [3,4,5,6,8,9,10,11,12,13,14,15,16,17,19,23]
#index of columns not meant to be summed
column_nosumidx = [20, 18, 21, 22]
#just the column names I want on my new dataframe
column_names = ['PLAYER_NAME','MINS_PLYD','GOALS_SCORED','ASSISTS','CLEAN_SHEET','OWN_GOALS','PENALTIES_SAVED','PENALTIES_MISSED','YELLOW_CARDS','RED_CARDS','SAVES','BONUS','EA_PPI','BONUS_POINTS_SYS','NET_TRANSFERS','PLAYER_VALUE','POINTS','TEAM_NAME','POSITION','SELECTED_BY']
# this is the new dataframe, the one I wish to fill with one row per player
player_totalstats = pd.DataFrame(index = range(0,no_players),columns = column_names )
# raw dataframe with only the columns meant to be summed
playerstats_sum = df_playerstats.iloc[:,column_sumidx]
# raw dataframe with only the columns not meant to be summed
playerstats_nosum = df_playerstats.iloc[:,column_nosumidx]
for i in range(0,no_players) :
try :
player_totalstats.iloc[i,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,19]] = playerstats_sum[df_playerstats['PLAYER_NAME'] == player_names[i]].sum()
# I use sum with the columns not meant to be summed because I couldn't do it
#otherwise. It works because only one column is summed` `
player_totalstats.iloc[i,[0,15,17,18]] = playerstats_nosum[df_playerstats['PLAYER_NAME'] == player_names[i]][-1:].sum()
except:
print 'oops' , i
break
答案 0 :(得分:1)
这是您测试数据的解决方案,我认为您可以轻松地将其应用于您的真实数据
In [16]: df
Out[16]:
Mins Goals Ass Value Name
0 0 0 0 5.4 Wojciech Szczesny
1 90 0 0 5.4 Wojciech Szczesny
2 0 0 0 5.4 Wojciech Szczesny
3 0 0 0 5.4 Laurent Koscielny
4 90 0 0 5.4 Laurent Koscielny
In [17]: df.groupby('Name').agg({'Mins': np.sum, 'Goals': np.sum, 'Ass': np.sum, 'Value': lambda x: x.iloc[-1]})
Out[17]:
Ass Mins Goals Value
Name
Laurent Koscielny 0 90 0 5.4
Wojciech Szczesny 0 90 0 5.4