基于分组最小值为DataFrame新增列:棒球出勤数据处理需求
搞定棒球比赛DataFrame的新增列需求
嘿,我来帮你实现这两个新增列的需求,假设你用的是pandas(毕竟处理DataFrame它是首选),下面是一套清晰易维护的实现方案:
第一步:先把日期列转成datetime格式
这是关键前提,只有日期是datetime类型,我们才能准确按年份分组并找到首场比赛:
import pandas as pd # 假设你的日期列名叫game_date,先转成datetime格式 df['game_date'] = pd.to_datetime(df['game_date'])
第二步:生成opening_day二元列
我们先按年份分组,找到每个年度的最早比赛日期,然后给对应行标记1,其他行标记0:
# 提取每个年度的首场比赛日期 first_game_dates = df.groupby(df['game_date'].dt.year)['game_date'].min() # 用isin判断每行是否是年度首场,转成int类型的1/0 df['opening_day'] = df['game_date'].isin(first_game_dates).astype(int)
第三步:填充opening_day_attendance列
接下来我们要把每个年度首场比赛的出勤数,填充到该年度的所有行里:
# 先筛选出所有opening_day为1的行,按年份提取出勤数(假设出勤列叫attendance) yearly_opening_attendance = df[df['opening_day'] == 1].set_index(df['game_date'].dt.year)['attendance'] # 用年份映射,把对应年度的首场出勤数填充到所有行 df['opening_day_attendance'] = df['game_date'].dt.year.map(yearly_opening_attendance)
更紧凑的transform写法(可选)
如果你喜欢用一行式的分组处理,也可以用transform来简化代码,逻辑是完全一致的:
# 生成opening_day列 df['opening_day'] = (df['game_date'] == df.groupby(df['game_date'].dt.year)['game_date'].transform('min')).astype(int) # 生成opening_day_attendance列 df['opening_day_attendance'] = df.groupby(df['game_date'].dt.year)['attendance'].transform( lambda group: group[group.index == group.idxmin()].values[0] )
这样处理后,你就得到了想要的两列:opening_day精准标记年度首场比赛(1是,0否),opening_day_attendance则把对应年度首场的出勤数同步到该年度的每一行里。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

