【发布时间】:2020-12-19 15:45:20
【问题描述】:
我有一个类似于下面的 DataFrame:,我想向它添加一个 Streak 列(参见下面的示例):
Date Home_Team Away_Team Winner Streak
2005-08-06 A G A 0
2005-08-06 B H H 0
2005-08-06 C I C 0
2005-08-06 D J J 0
2005-08-06 E K K 0
2005-08-06 F L F 0
2005-08-13 A B A 1
2005-08-13 C D D 1
2005-08-13 E F F 0
2005-08-13 G H H 0
2005-08-13 I J J 0
2005-08-13 K L K 1
2005-08-20 B C B 0
2005-08-20 A D A 2
2005-08-20 G K K 0
2005-08-20 I E E 0
2005-08-20 F H F 2
2005-08-20 J L J 2
2005-08-27 A H A 3
2005-08-27 B F B 1
2005-08-27 J C C 3
2005-08-27 D E D 0
2005-08-27 I K K 0
2005-08-27 L G G 0
2005-09-05 B A A 2
2005-09-05 D C D 1
2005-09-05 F E F 0
2005-09-05 H G H 0
2005-09-05 J I I 0
2005-09-05 K L K 4
从 2005 年到 2020 年,DataFrame 大约有 20 万行。
现在,我要做的是在 DataFrame 的 Date 列中找到主队在该日期之前赢得的连续比赛数。 我有一个解决办法,但是太慢了,见下文:
df["Streak"] = 0
def home_streak(x): # x is a row of the DataFrame
"""Keep track of a team's winstreak"""
home_team = x["Home_Team"]
date = x["Date"]
# all previous matches for the home team
home_df = df[(df["Home_Team"] == home_team) | (df["Away_Team"] == home_team)]
home_df = home_df[home_df["Date"] < date].sort_values(by="Date", ascending=False).reset_index()
if len(home_df.index) == 0: # no previous matches for that team, so start streak at 0
return 0
elif home_df.iloc[0]["Winner"] != home_team: # lost the last match
return 0
else: # they won the last game
winners = home_df["Winner"]
streak = 0
for i in winners.index:
if home_df.iloc[i]["Winner"] == home_team:
streak += 1
else: # they lost, return the streak
return streak
df["Streak"] = df.apply(lambda x: home_streak(x), axis = 1)
如何加快速度?
【问题讨论】:
-
所以你想按主队分组并计算连续获胜?
-
如果
A作为客队获胜会怎样?如果输了怎么办?这会继续/结束连胜吗?还是信息丢失了? -
它继续/结束连胜。主场/客场与连续上垒无关,我只想要主队的连续上垒。
-
我明白了。所以你可以看到跳跃吗?您如何知道以客队结束的球队的连胜纪录?您可以随时为客场连胜添加一列...
-
有道理。我只是想在回答之前确保我完全理解了这个问题。最后一个问题:您对 numpy 而不是 pandas 解决方案还满意吗?
标签: python pandas numpy dataframe