我正在尝试基于pandas数据框中另一个列的值来计算一个值出现的次数。这里是数据框:
基本上,我想计算1队或2队在2017赛季(基于年份)中发生1的次数。现在这是我的代码
total_wins={}
teams=matches['team1'].unique()
for i in teams:
total_matches[i]=len(matches[matches['winner'] == i])+len(matches[matches['team2'] == i])
答案 0 :(得分:1)
好像是groupby
的工作!
team_id = 1
result = (
matches
.groupby("season")
.apply(
lambda group: group.team1.eq(team_id).sum() + group.team2.eq(team_id).sum()
)
换句话说:
team1
和team2
列在哪里等于team_id
... True
的数量)求和... 因为您提供了DataFrame的图像,而不是我可以选择的图像,所以我无法为您的精确案例提供示例输出,但是您最终应该得到一个按季节索引并包含球队与之匹配的比赛数的系列ID 1
按照您的要求参加了那个赛季。
您可以使用result["2017"]
获得2017赛季的答案。然后,您可以循环查看团队ID,以获取其他团队的结果。
答案 1 :(得分:1)
您可以通过一些布尔索引来做到这一点。考虑以下数据框:
import pandas as pd
import numpy as np
np.random.seed(3)
df = pd.DataFrame({
"season": np.repeat([2017, 2018, 2019], 5),
"team_1": np.random.randint(5, size=15),
"team_2": np.random.randint(5, size=15),
"toss_winner": np.random.randint(5, size=15)
})
print(df)
season team_1 team_2 toss_winner
0 2017 2 4 3
1 2017 0 0 0
2 2017 1 2 3
3 2017 3 1 1
4 2017 0 2 3
5 2018 0 2 0
6 2018 0 2 4
7 2018 3 4 1
8 2018 2 1 4
9 2018 3 3 4
10 2019 1 2 0
11 2019 1 0 0
12 2019 2 1 1
13 2019 0 2 2
14 2019 4 0 4
如果您要专门研究任一团队在2017年获得1分的次数,则可以使用一些有趣的布尔索引来实现。首先,我看到“ team_1”或“ team_2”在哪里产生了一个2d布尔数组,然后我用.any(axis=1)
给了我一个1d布尔数组,其长度与我的数据帧相同,如果有“ team_1”或“ team_2”为1。接下来,无论“ season” == 2017何时,我都将为我的数据框创建一个布尔数组。我们可以将它们组合在一起以创建2017季节的特定子集,无论其中哪个是1。
team_1_played = (df[["team_1", "team_2"]] == 1).any(axis=1)
season_2017 = df["season"] == 2017
print(df.loc[season_2017 & team_1_played ])
season team_1 team_2 toss_winner
2 2017 1 2 3
3 2017 3 1 1
我们还可以结合和sum
布尔数组来查看在第一个团队1参加2017年比赛中发生了多少场比赛。请注意,这与上方数据框子集的长度相同。
print((season_2017 & team_1_played ).sum())
2
您还可以使用groupby / apply方法来计算每个值在任一团队中出现的次数。
out = (df.groupby("season")[["team_1", "team_2"]]
.apply(lambda group: group.apply(pd.Series.value_counts))
.fillna(0))
print(out)
team_1 team_2
season
2017 0 2.0 1.0
1 1.0 1.0
2 1.0 2.0
3 1.0 0.0
4 0.0 1.0
2018 0 2.0 0.0
1 0.0 1.0
2 1.0 2.0
3 2.0 1.0
4 0.0 1.0
2019 0 1.0 2.0
1 2.0 1.0
2 1.0 2.0
4 1.0 0.0
例如,在此数据帧中,您可以看到在2017年,第2团队以“ team_1”的方式发挥了1.0倍,而在“ team_2”中的发挥了2.0倍。