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

如何基于Pandas分组tail(1)索引为DataFrame添加上下半场布尔列

给Pandas DataFrame添加上下半场标记布尔列

你的现有代码已经拿到了每场比赛上下半场的最后一行索引,但直接用原索引和这些分组后的索引比较会出错——因为firsthalf_index是多级索引结构(外层是Date+Match分组,内层是原DataFrame的索引),没法直接和原DataFrame的单级索引做逐行比较。下面是修正后的实现方案:

步骤1:将分界索引映射到每行数据

通过groupby.transform把每场的上下半场最后索引,匹配到该行所属的分组中,让每行都能拿到对应比赛的上下半场分界点:

# 获取每行对应比赛的上半场最后一行索引
df['firsthalf_last_idx'] = df.groupby(['Date','Match'])['M'].transform(
    lambda x: x[(x >=1) & (x <=45)].tail(1).index[0] if not x[(x >=1) & (x <=45)].empty else None
)

# 获取每行对应比赛的下半场最后一行索引
df['secondhalf_last_idx'] = df.groupby(['Date','Match'])['M'].transform(
    lambda x: x[(x >=46) & (x <=90)].tail(1).index[0] if not x[(x >=46) & (x <=90)].empty else None
)

这里加了空值判断,避免某些比赛没有对应时段数据时抛出错误。

步骤2:创建布尔列标记上下半场

基于每行的索引和对应分组的分界索引比较,生成布尔列:

# 标记上半场:行索引 <= 对应比赛的上半场最后索引
df['is_first_half'] = df.index <= df['firsthalf_last_idx']

# 标记下半场:行索引 > 上半场最后索引 且 <= 下半场最后索引
df['is_second_half'] = (df.index > df['firsthalf_last_idx']) & (df.index <= df['secondhalf_last_idx'])

可选:清理临时列

如果不需要保留分界索引的临时列,可以删掉:

df = df.drop(['firsthalf_last_idx', 'secondhalf_last_idx'], axis=1)

这样处理后,每行数据都会有对应的is_first_half和is_second_half布尔值,准确标记所属的比赛时段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:05:21