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

Dataframes - Sum some columns, get the last value from others

我得到了一些梦幻足球数据,我正在尝试整理它,以便稍后可以应用它,充分发挥 scikit-learn 的作用。

我将其保存在 mysql 数据库中,并使用 pd.read_sql 进入数据框。数据框的所有行都是特定球员的比赛,每一列都包含红牌、黄牌、助攻、零封等统计数据。这将导致每个球员有多行,每场比赛一个。

我的问题是,如果将其中一些统计数据加起来然后除以上场分钟数(例如进球数、助攻数等)会更有意义。其他的,比如name,team,value,取最近的值才有意义

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

我找到了一种非常丑陋的方法来执行此操作,但是总和计算不正确并且非常混乱。我对 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

这是您测试数据的解决方案,我认为您可以轻松地将其应用于您的真实数据

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