如何解决编写一个函数来添加用于从俱乐部转入和转入俱乐部的列时出现问题
我的一个项目有问题。我正在尝试对足球中的转会做一个清晰的概述,目前我有这个表格:
俱乐部ID | 玩家ID | 起始日期 | 截止日期 | 团队名称 | c_Person |
---|---|---|---|---|---|
1 | 1 | 2010-01-01 | 2012-01-01 | 俱乐部A | 玩家 1 |
2 | 1 | 2012-02-01 | 2015-02-01 | B 俱乐部 | 玩家 1 |
3 | 1 | 2015-05-01 | 2018-02-01 | C 俱乐部 | 玩家 1 |
1 | 2 | 2010-01-01 | 2018-02-02 | 俱乐部A | 玩家 2 |
1 | 2 | 2018-03-02 | 2020-02-01 | 俱乐部A | 玩家 2 |
但是,我想添加列 FromClub 和 ToClub。如果球员 1 从 2010 年 1 月 1 日至 2012 年 1 月 1 日首次为俱乐部 A 效力,并于 2012 年 2 月 1 日至 2015 年 2 月 1 日为俱乐部 B 转会和踢球,我想要“FromClub”和“ToClub”说明转移。
我希望表格看起来像这样:
俱乐部ID | 玩家ID | 起始日期 | 截止日期 | 团队名称 | c_Person | FromClub | ToClub |
---|---|---|---|---|---|---|---|
1 | 1 | 2010-01-01 | 2012-01-01 | 俱乐部A | 玩家 1 | 南 | 南 |
2 | 1 | 2012-02-01 | 2015-02-01 | B 俱乐部 | 玩家 1 | 俱乐部A | B 俱乐部 |
3 | 1 | 2015-05-01 | 2018-02-01 | C 俱乐部 | 玩家 1 | B 俱乐部 | C 俱乐部 |
1 | 2 | 2010-01-01 | 2018-02-02 | 俱乐部A | 玩家 2 | 南 | 南 |
1 | 2 | 2018-03-02 | 2020-02-01 | 俱乐部A | 玩家 2 | 南 | 南 |
我一直在尝试编写一个函数,但无法解决它。希望其他人可以帮助我解决这个问题。
这是创建第一个表的代码:
import pandas as pd
from datetime import datetime
df = pd.DataFrame({'ClubID':[1,2,3,1,1],'PlayerID':[1,2],'FromDate':["2010-01-01","2012-02-01","2015-05-01","2010-01-01","2018-03-02"],'ToDate':["2012-01-01","2015-02-01","2018-02-01","2018-02-02","2020-02-01"],'TeamName':["Club A","Club B","Club C","Club A","Club A"],'c_Person':["Player 1","Player 1","Player 2","Player 2"]})
# convert the 'Date' columns to datetime format
df['FromDate']= pd.to_datetime(df['FromDate'])
df['ToDate']= pd.to_datetime(df['ToDate'])
提前致谢!
解决方法
首先对于数据框中的每一行,包括每个球员在转会前所在的上一支球队的信息:
df['PreviousTeam'] = df.groupby('PlayerID')['TeamName'].shift()
>>> df
ClubID FromDate PlayerID TeamName ToDate c_Person PreviousTeam
0 1 2010-01-01 1 Club A 2012-01-01 Player 1 NaN
1 2 2012-02-01 1 Club B 2015-02-01 Player 1 Club A
2 3 2015-05-01 1 Club C 2018-02-01 Player 1 Club B
3 1 2010-01-01 2 Club A 2018-02-02 Player 2 NaN
4 1 2018-03-02 2 Club A 2020-02-01 Player 2 Club A
然而,如果球员被转移到同一支球队,前支球队与当前球队相同(第 4 行)。所以应用下面的操作来解决这个问题:
df['FromClub'] = df[df['PreviousTeam'] != df['TeamName']]['PreviousTeam']
最后从ToClub
中可以通过观察球员转会的时间得到FromClub
列:
df['ToClub'] = df[~df['FromClub'].isna()]['TeamName']
>>> df.drop('PreviousTeam',axis=1)
ClubID FromDate PlayerID TeamName ToDate c_Person FromClub ToClub
0 1 2010-01-01 1 Club A 2012-01-01 Player 1 NaN NaN
1 2 2012-02-01 1 Club B 2015-02-01 Player 1 Club A Club B
2 3 2015-05-01 1 Club C 2018-02-01 Player 1 Club B Club C
3 1 2010-01-01 2 Club A 2018-02-02 Player 2 NaN NaN
4 1 2018-03-02 2 Club A 2020-02-01 Player 2 NaN NaN
因此,将所有内容都放在一个函数中,您只需使用数据框调用下面的内容即可获得所需的输出:
def fill_club_details(df):
df['PreviousTeam'] = df.groupby('PlayerID')['TeamName'].shift()
df['FromClub'] = df[df['PreviousTeam'] != df['TeamName']]['PreviousTeam']
df['ToClub'] = df[~df['FromClub'].isna()]['TeamName']
return df.drop('PreviousTeam',axis=1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。