数据帧 - 对一些列求和,从其他列中获取最后一个值

时间:2015-02-17 17:15:37

标签: python mysql pandas

我得到了一些奇幻的足球数据,我正在努力解决它,以便我可以稍后申请,这是scikit-learn的全部力量。

我在mysql数据库上有它,然后我用pd.read_sql进入了一个数据帧。数据框的所有行都是特定玩家的游戏,每列包含红牌,黄牌,助攻,干净的纸张等统计信息。这将导致每个玩家有多行,每个游戏都有一行。

我的问题是,如果总结起来,其中一些统计数据更有意义,然后除以分钟数,比如目标,助攻等。其他的,例如名称,团队和价值,只有获得最新价值才有意义。

因此,我想要做的是一个新的数据帧,其中每个玩家都有一行。有些列将是给定玩家的统计数据的总和,而其他列将只是该玩家的最后一个值。

我找到了一种非常难看的方法,但总和计算错误,而且非常混乱。我仍然是python的新手,所以所有的帮助都表示赞赏。 这样做的最佳方式是什么?

一些数据(刚刚制作但格式相同):

enter image description here

在这种情况下,每一行都是给定玩家的一个游戏,Szczesny和Koscielny。分钟,目标和助攻等栏目我想对所有比赛进行总结,但其他比赛,如价值和名称,我只想保留最后一个值。

最终结果是:

enter image description here

到目前为止

代码:

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

1 个答案:

答案 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