计算每支球队自上次比赛以来经过了多少天

后端开发 2026-07-10

我在尝试在数据框中创建两列,分别表示自上次比赛结束以来主队和客队各自经过的天数。

这是我的数据框当前的样子:

Date           team_home    team_away
2026-05-10     Tottenham    Arsenal
2026-05-11     Liverpool    West Ham
2026-05-13     West Ham     Chelsea
2026-05-13     Arsenal      Liverpool

我想得到这样的结果:

Date           team_home    team_away    home_diff    away_diff
2026-05-10     Tottenham    Arsenal      0            0
2026-05-11     Liverpool    West Ham     0            0
2026-05-13     West Ham     Chelsea      2            0
2026-05-13     Arsenal      Liverpool    3            2

这是因为,例如西汉姆联在2026-05-11进行比赛,早于2026-05-13,因此这两个日期之间相差2 天。

我在把它写成代码的过程中遇到了困难,到现在还没想出任何实现方法。

解决方案

你可以先 melt 将数据框变成每个队伍和日期各占一行的形式,然后按日期排序,再使用 groupby 计算天数差,并结合 diff,最后 pivot 将数据重新转回原始格式:

import pandas as pd


def calculate_days_diff(df: pd.DataFrame) -> pd.DataFrame:
    result = df.copy()
    result["Date"] = pd.to_datetime(result["Date"])
    result["_row"] = range(len(result))
    long_df = result.melt(
        id_vars=["_row", "Date"],
        value_vars=["team_home", "team_away"],
        var_name="side",
        value_name="team",
    )
    long_df["days_diff"] = (
        long_df.sort_values(["Date", "_row"])
        .groupby("team", sort=False)["Date"]
        .diff()
        .dt.days.fillna(0)  # fillna can be removed if you want to use NaN for the first occurrence
        .astype(int)
    )
    diff_df = long_df.pivot(index="_row", columns="side", values="days_diff").rename(
        columns={"team_home": "home_diff", "team_away": "away_diff"}
    )[["home_diff", "away_diff"]]
    return result.join(diff_df, on="_row").drop(columns="_row")


def main() -> None:
    import io

    data = """\
Date,team_home,team_away
2026-05-10,Tottenham,Arsenal
2026-05-11,Liverpool,West Ham
2026-05-13,West Ham,Chelsea
2026-05-13,Arsenal,Liverpool
"""
    df = pd.read_csv(io.StringIO(data))
    result_df = calculate_days_diff(df)
    print(result_df)
    """\
        Date  team_home  team_away  home_diff  away_diff
0 2026-05-10  Tottenham    Arsenal          0          0
1 2026-05-11  Liverpool   West Ham          0          0
2 2026-05-13   West Ham    Chelsea          2          0
3 2026-05-13    Arsenal  Liverpool          3          2
"""


if __name__ == "__main__":
    main()

编辑:已将 "team"sort_values 中移除,因为它对结果没有影响。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章