我有2个数据框,一个是棒球队的数据,另一个是团队球员信息。我需要在团队数据框中添加一个团队薪水列,按年和团队查找薪资数据,并返回该年/团队的玩家工资总和。我尝试了很多不同的方法,但我认为我最接近这个方法:
def get_team_salary(year, team):
data_slice = salary_data_df[(salary_data_df.yearID == year) &
(salary_data_df.teamID == team)]
return data_slice['salary'].sum()
#This line of code works correctly without the next function in the code.
#team_data_df['team_salary'] = get_team_salary(2000,'ANA')
def assign_team_salaries(team_data_df):
year = team_data_df['yearID']
team = team_data_df['teamID']
return team_data_df.applymap(get_team_salary(year, team))
team_data_df['team_salary'] = assign_team_salaries(team_data_df)
这是assign_team_salaries
函数调用不起作用。我已经尝试了很多不同的东西来修复它并收到了很多不同的错误消息。你得到的是"ValueError: Can only compare identically-labeled Series objects"
有人可以帮我弄清楚我做错了什么吗?我尝试了完全不同的方法,比如在工资数据上使用groupby
并首先合并两个数据框,但我也无法使这些方法工作。 TIA!
team_data_df
包含大量列,但相关的列(按顺序)如下:
teamID yearID
2000 ANA
2000 ARI
... ...
2016 TOR
2016 WSN
salary_data_df
有相关列:
teamID yearID playerID salary
2000 ANA anderga01 3250000
... ... ... ...
2016 WSN zimmery01 14000000
答案 0 :(得分:0)
正如您所提到的,您可以在.groupby
上使用salary_data_df
,然后将这些总和合并到team_data_df
。
采取以下两个小例子:
print(team_data_df)
teamID yearID
0 a 2000
1 b 2000
2 c 2000
3 a 2001
4 b 2001
5 c 2001
print(salary_data_df)
teamID yearID playerID salary
0 a 2000 1 100
1 a 2000 2 200
2 b 2000 4 300
3 b 2000 5 400
4 b 2000 6 500
5 c 2000 7 600
6 a 2001 1 700
7 a 2001 2 800
8 a 2001 3 900
9 b 2001 4 1000
10 b 2001 5 1100
11 c 2001 7 1200
12 c 2001 8 1300
然后:
sums = (salary_data_df
.groupby(by=['yearID', 'teamID'])
.sum()['salary']
.reset_index())
# alternative: use parameter `as_index=True` instead of `.reset_index()`
res = team_data_df.merge(sums, on=['yearID', 'teamID'])
print(res)
teamID yearID salary
0 a 2000 300
1 b 2000 1200
2 c 2000 600
3 a 2001 2400
4 b 2001 2100
5 c 2001 2500
您可能还需要注意合并的on
参数。它们模仿类似SQL的合并规范。