You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于相同Game_ID交换Runs_scored值生成Runs_allowed列的替代方案

嘿,这里有几个不同的思路来实现你需要的Runs_allowed列,每种方法各有千秋,看看哪个更适合你的场景:

方法1:分组反转法(简洁直观)

因为每个Game_ID刚好对应两行数据,我们可以按Game_ID分组,直接把每组内的Runs_scored倒序,就能得到对应的失分:

df['Runs_allowed'] = df.groupby('Game_ID')['Runs_scored'].transform(lambda x: x.iloc[::-1].values)

这个方法逻辑很清晰,transform会把每个分组内的得分倒序后,重新映射回原数据的每一行,完美实现两行数值交换的需求。

方法2:自连接法(逻辑明确)

如果想要更清晰地区分主客队的数据,可以把数据拆成主队和客队两个子表,再通过Game_ID自连接,直接获取对方的得分作为失分:

# 拆分主队、客队的得分数据
home_runs = df[df['play_homevisitor'] == 1][['Game_ID', 'Runs_scored']].rename(columns={'Runs_scored': 'home_runs'})
away_runs = df[df['play_homevisitor'] == 0][['Game_ID', 'Runs_scored']].rename(columns={'Runs_scored': 'away_runs'})

# 合并回原数据
df = df.merge(home_runs, on='Game_ID').merge(away_runs, on='Game_ID')

# 根据主客队标识赋值失分
df['Runs_allowed'] = df.apply(
    lambda row: row['home_runs'] if row['play_homevisitor'] == 0 else row['away_runs'],
    axis=1
)

# 按需清理临时列
df = df.drop(['home_runs', 'away_runs'], axis=1)

这种方法虽然步骤多一点,但每一步的逻辑都很明确,适合需要对主客队数据做额外处理的场景。

方法3:Numpy索引反转法(性能最优)

如果你的数据集很大,追求极致性能的话,可以利用数据的排列规律(每两行一组),用Numpy的索引操作直接交换数值:

import numpy as np

# 把得分转成numpy数组
runs_array = df['Runs_scored'].values
# 生成交换索引:偶数位和下一个奇数位交换,比如[1,0,3,2,5,4]
swap_indices = np.arange(len(runs_array)) ^ 1
# 赋值失分列
df['Runs_allowed'] = runs_array[swap_indices]

这个方法完全是向量操作,没有循环,速度最快,尤其适合处理百万级以上的大数据量。

你之前用shift的方法也很巧妙,不过上面这几种方法在逻辑清晰度或者性能上各有优势,可以根据你的数据规模和代码可读性需求来选择~

内容的提问来源于stack exchange,提问作者ManuelVillamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:35:25