计算每支球队自上次比赛以来经过了多少天
我在尝试在数据框中创建两列,分别表示自上次比赛结束以来主队和客队各自经过的天数。
这是我的数据框当前的样子:
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。