如何基于Pandas DataFrame两个关联列循环计算生成新列
解决Pandas DataFrame自定义赋值问题
实现思路
不建议使用逐行循环实现,采用Pandas向量化分组操作效率更高,逻辑如下:
- 按
batter-pitcher字段分组,保证计算仅在同一个投打组合内生效 - 每组内按投球顺序(
pitch_number升序)排序 - 标记每组内
prev_count != '3--2'的行作为锚点,提取锚点的pitch_number值 - 对每组内的空锚点值做反向填充,让所有
prev_count == '3--2'的行都能获取到下方第一个符合要求的锚点pitch_number - 按给定公式计算
pitches列的值
完整代码实现
构造示例数据
import pandas as pd import numpy as np data = { 'player_name': ['Graveman, Kendall', 'Smyly, Drew', 'Graveman, Kendall', 'Maton, Phil', 'Martin, Chris', 'Urquidy, José', 'Urquidy, José', 'Urquidy, José', 'García, Yimi', 'García, Yimi', 'García, Yimi', 'García, Yimi', 'García, Yimi', 'Valdez, Framber', 'Valdez, Framber'], 'batter-pitcher': ['501303---608665', '608665---592767', '592696---608665', '621020---664208', '514888---455119', '624585---664353', '624585---664353', '624585---664353', '594807---554340', '594807---554340', '594807---554340', '594807---554340', '594807---554340', '592696---664285', '518692---664285'], 'pitch_number': [6,6,8,6,6,8,7,6,12,11,10,9,8,6,6], 'count': ['3--2']*15, 'prev_count': ['3--1', '2--2', '2--2', '3--1', '2--2', '3--2', '3--2', '3--1', '3--2', '3--2', '3--2', '3--2', '2--2', '2--2', '2--2'] } df = pd.DataFrame(data, index=[62,4,186,87,252,171,177,192,191,198,209,219,229,10,57])
核心处理逻辑
# 按投打组合分组,每组内按投球序号升序排序 df = df.sort_values(['batter-pitcher', 'pitch_number']) # 标记锚点投球序号,反向填充获取所有行对应的锚点值 df['anchor_pitch'] = df.groupby('batter-pitcher').apply( lambda x: np.where(x['prev_count'] != '3--2', x['pitch_number'], np.nan) ).explode().values df['anchor_pitch'] = df.groupby('batter-pitcher')['anchor_pitch'].bfill() # 按公式计算pitches列,仅count为3--2的行保留计算值 df['pitches'] = np.where(df['count'] == '3--2', df['pitch_number'] + 1 - df['anchor_pitch'], np.nan) # 恢复原始索引顺序 df = df.loc[[62,4,186,87,252,171,177,192,191,198,209,219,229,10,57]]
结果验证
打印df[['pitch_number', 'prev_count', 'pitches']]即可查看结果,完全匹配示例要求:
- 索引171的pitches值为3,177为2,192为1
- 索引191的pitches值为5,229为1
- 其余标注行的pitches值均为1
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

