根据另一列的值计算熊猫列中的元素数

时间:2020-09-30 17:01:51

标签: python python-3.x pandas

我正在尝试基于pandas数据框中另一个列的值来计算一个值出现的次数。这里是数据框:

enter image description here

基本上,我想计算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])

2 个答案:

答案 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()
        )

换句话说:

  • 查看与“季节”的每个唯一值相对应的帧子集
  • 向此子集应用一个函数,该函数检查team1team2列在哪里等于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倍。