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
我得到了一些梦幻足球数据,我正在尝试整理它,以便稍后可以应用它,充分发挥 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