【问题标题】:Pandas: sum every N amount of rows by conditionPandas:按条件对每 N 行求和
【发布时间】:2021-06-24 01:50:17
【问题描述】:

我有一个类似的 DataFrame

      Date                  HomeTeam         OpponentTeam          Team_1 Goals
0     2020-05-01            Team_1              Team_2                 0
1     2020-05-02            Team_2              Team_1                 3
2     2020-05-03            Team_1              Team_3                 1
3     2020-05-04            Team_5              Team_1                 2
4     2020-05-05            Team_1              Team_2                 2
5     2020-05-06            Team_1              Team_4                 1                  

我需要计算Team_1 Goals 每 40 场比赛的总和,而不仅仅是所有比赛。请注意,DataFrame 包含没有 Team_1 的游戏,应该忽略这些游戏。然后我需要画一个图来展示这些总和每年是如何变化的(Team_1 每年总是有超过 40 场比赛)。我试过了:

df["GoalSum"] = df[((df["HomeTeam"] == "Team_1") | (df["OpponentTeam"] == "Team_1")) & (df["Team_1 Goals"] != -1)].dropna()[:40].sum()["Team_1 Goals"]
plt.plot(pd.DatetimeIndex(df['Date']).year, df["GoalSum"])
plt.show()

但不幸的是,这会计算所有 Team_1 Goals 的总和,因此该图是一条直线。我如何计算每 40 场比赛的 Team_1 进球数?一如既往,我们非常感谢任何建议。

编辑:预期输出将是(如果我们想每 3 场比赛求和):

      Date                  HomeTeam         OpponentTeam          Team_1 Goals        GoalSum
0     2020-05-01            Team_1              Team_2                 0
1     2020-05-02            Team_2              Team_1                 3
2     2020-05-03            Team_1              Team_3                 1                  4
3     2020-05-04            Team_5              Team_1                 2
4     2020-05-05            Team_1              Team_2                 2
5     2020-05-06            Team_1              Team_4                 1                  5

预期的情节如下:

【问题讨论】:

  • 能否请您在问题中发布预期输出示例,以便更好地理解您的问题,谢谢。
  • @RavinderSingh13 问题已更新。
  • 能否请您更新您的第一个数据框,或者完全删除它。现在令人困惑,因为您的问题是“如何从第一个数据帧转到第二个数据帧”,这是不可能的。
  • 这能回答你的问题吗? Take the sum of every N rows in a pandas series。它适用于系列,但同样的原则适用:按 n 行分组(因此 不是 按特定的列组合),然后对这些组求和。您的意思是需要做一些额外的工作才能将结果返回到相同的数据帧中。
  • 我试图展示原始 DataFrame 与预期的不同。

标签: python pandas


【解决方案1】:

我用一些“附加”行定义了您的源 DataFrame 没有Team_1参与的游戏:

         Date HomeTeam OpponentTeam  Team_1 Goals
0  2020-05-01   Team_1       Team_2             0
1  2020-05-02   Team_2       Team_1             3
2  2020-05-03   Team_1       Team_3             1
3  2020-05-03   Team_4       Team_2             -1
4  2020-05-04   Team_5       Team_1             2
5  2020-05-05   Team_1       Team_2             2
6  2020-05-06   Team_1       Team_4             1
7  2020-05-06   Team_2       Team_3             -1

从您的代码示例中,我推断没有 Team_1 的行有 Team_1 目标 的值设置为 -1,但实际上这些 行不会参与求和。

第一步是生成一个临时的DataFrame,仅限于 与 Team_1 的比赛:

dfLim = df.query("HomeTeam == 'Team_1' or OpponentTeam == 'Team_1'")

假设您的组大小为 3,就像在您的示例中一样:

gSize = 3

要为每个组生成总和,请定义以下函数:

def mySum(grp):
    return pd.Series([grp['Team_1 Goals'].sum()], index=[grp.index[-1]])

要使用这些总和添加新列,请运行:

df['GoalSum'] = dfLim.groupby(np.arange(len(dfLim.index)) // gSize, group_keys=False)\
    .apply(mySum)
df.fillna(' ', inplace=True)

结果是:

         Date HomeTeam OpponentTeam  Team_1 Goals GoalSum
0  2020-05-01   Team_1       Team_2             0        
1  2020-05-02   Team_2       Team_1             3        
2  2020-05-03   Team_1       Team_3             1       4
3  2020-05-03   Team_4       Team_2            -1        
4  2020-05-04   Team_5       Team_1             2        
5  2020-05-05   Team_1       Team_2             2        
6  2020-05-06   Team_1       Team_4             1       5
7  2020-05-06   Team_2       Team_3            -1        

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多