在Pandas中基于match_id与wl_g列生成wl_s列的实现方案
Pandas实现单场比赛胜负列(wl_s)的生成方法
需求说明
基于现有数据中的wl_g列,按match_id分组生成新列wl_s:同一match_id下,若某队伍的wl_g中"win"的次数达到2次及以上,则该队伍所有行的wl_s值为"win",否则为"lose"。
原始数据
| player | team | opp | wl_g | game_id | match_id |
|---|---|---|---|---|---|
| Laz | ZETA | DRX | lose | 119512 | 184456 |
| TENNN | ZETA | DRX | lose | 119512 | 184456 |
| MaKo | DRX | ZETA | win | 119512 | 184456 |
| Foxy9 | DRX | ZETA | win | 119512 | 184456 |
| Laz | ZETA | DRX | win | 119513 | 184456 |
| TENNN | ZETA | DRX | win | 119513 | 184456 |
| MaKo | DRX | ZETA | lose | 119513 | 184456 |
| Foxy9 | DRX | ZETA | lose | 119513 | 184456 |
| Laz | ZETA | DRX | lose | 119514 | 184456 |
| TENNN | ZETA | DRX | lose | 119514 | 184456 |
| MaKo | DRX | ZETA | win | 119514 | 184456 |
| Foxy9 | DRX | ZETA | win | 119514 | 184456 |
实现代码
import pandas as pd # 构造示例数据(如果已有数据框可跳过此步骤) data = [ ["Laz", "ZETA", "DRX", "lose", 119512, 184456], ["TENNN", "ZETA", "DRX", "lose", 119512, 184456], ["MaKo", "DRX", "ZETA", "win", 119512, 184456], ["Foxy9", "DRX", "ZETA", "win", 119512, 184456], ["Laz", "ZETA", "DRX", "win", 119513, 184456], ["TENNN", "ZETA", "DRX", "win", 119513, 184456], ["MaKo", "DRX", "ZETA", "lose", 119513, 184456], ["Foxy9", "DRX", "ZETA", "lose", 119513, 184456], ["Laz", "ZETA", "DRX", "lose", 119514, 184456], ["TENNN", "ZETA", "DRX", "lose", 119514, 184456], ["MaKo", "DRX", "ZETA", "win", 119514, 184456], ["Foxy9", "DRX", "ZETA", "win", 119514, 184456] ] df = pd.DataFrame(data, columns=["player", "team", "opp", "wl_g", "game_id", "match_id"]) # 1. 统计每个match_id+team组合的胜场次数 win_counts = df.groupby(["match_id", "team"])["wl_g"].apply(lambda x: (x == "win").sum()).reset_index(name="win_times") # 2. 将胜场数合并回原数据框 df = df.merge(win_counts, on=["match_id", "team"], how="left") # 3. 根据胜场数生成wl_s列 df["wl_s"] = df["win_times"].map(lambda x: "win" if x >= 2 else "lose") # 可选:删除中间计算列win_times df = df.drop("win_times", axis=1) # 查看结果 print(df)
代码说明
- 分组统计胜场:通过
groupby(["match_id", "team"])精准定位每个单场比赛中的队伍,用(x == "win").sum()统计该队伍的胜局数量。 - 合并数据:使用
merge将胜场统计结果关联回原数据,保证每一行都能获取到所属队伍在对应比赛中的胜场数。 - 生成目标列:根据胜场数是否≥2,为
wl_s列赋值"win"或"lose",最后可按需删除中间计算列win_times。
最终结果
| player | team | opp | wl_g | game_id | match_id | wl_s |
|---|---|---|---|---|---|---|
| Laz | ZETA | DRX | lose | 119512 | 184456 | lose |
| TENNN | ZETA | DRX | lose | 119512 | 184456 | lose |
| MaKo | DRX | ZETA | win | 119512 | 184456 | win |
| Foxy9 | DRX | ZETA | win | 119512 | 184456 | win |
| Laz | ZETA | DRX | win | 119513 | 184456 | lose |
| TENNN | ZETA | DRX | win | 119513 | 184456 | lose |
| MaKo | DRX | ZETA | lose | 119513 | 184456 | win |
| Foxy9 | DRX | ZETA | lose | 119513 | 184456 | win |
| Laz | ZETA | DRX | lose | 119514 | 184456 | lose |
| TENNN | ZETA | DRX | lose | 119514 | 184456 | lose |
| MaKo | DRX | ZETA | win | 119514 | 184456 | win |
| Foxy9 | DRX | ZETA | win | 119514 | 184456 | win |
内容的提问来源于stack exchange,提问作者Octa
相关产品推荐
相关产品推荐

