当Match列包含Matchup字符串时,对DataFrame的Matchup列执行前向填充
问题
现有一个DataFrame,需实现:仅当Matchup列的有效值存在于对应行的Match列字符串中时,对Matchup列进行前向填充操作。
原始DataFrame如下:
Type Match Matchup 0 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA NYY-vs-LAA 1 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA NaN 2 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD NYM-vs-LAD 3 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD NaN 4 Test All_Star_Game_12252000 NaN 5 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS BAL-vs-BOS 6 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS NaN 7 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL TBR-vs-COL 8 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL NaN 9 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL NaN
期望填充后的输出DataFrame:
Type Match Matchup 0 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA NYY-vs-LAA 1 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA NYY-vs-LAA 2 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD NYM-vs-LAD 3 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD NYM-vs-LAD 4 Test All_Star_Game_12252000 NaN 5 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS BAL-vs-BOS 6 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS BAL-vs-BOS 7 Child ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL TBR-vs-COL 8 Parent ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL TBR-vs-COL 9 SubChild ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL TBR-vs-COL
解决方案
实现思路
- 筛选出Matchup非空且该值确实存在于对应Match字符串中的行,作为填充锚点;
- 基于锚点对数据分组,连续的同锚点行归为一组;
- 仅对有效分组内的Matchup列做前向填充,不满足条件的行保留原NaN。
代码实现
import pandas as pd # 构建原始DataFrame data = { 'Type': ['Parent', 'Child', 'SubChild', 'SubChild', 'Test', 'Child', 'Parent', 'Child', 'Parent', 'SubChild'], 'Match': [ 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYY-vs-LAA', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_NYM-vs-LAD', 'All_Star_Game_12252000', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_BAL-vs-BOS', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL', 'ABC_12252000_NY_Leag_Natl_en-NY_RegSeason_TBR-vs-COL' ], 'Matchup': ['NYY-vs-LAA', None, 'NYM-vs-LAD', None, None, 'BAL-vs-BOS', None, 'TBR-vs-COL', None, None] } df = pd.DataFrame(data) # 标记有效锚点行 valid_anchor = df['Matchup'].notna() & df.apply(lambda row: row['Matchup'] in row['Match'], axis=1) # 生成分组键:每遇到一个有效锚点,分组号递增 df['group'] = valid_anchor.cumsum() # 分组前向填充Matchup df['Matchup'] = df.groupby('group')['Matchup'].ffill() # 删除临时分组列 df = df.drop('group', axis=1) # 打印结果 print(df)
代码说明
valid_anchor:通过布尔索引筛选符合条件的填充起点,确保只有Matchup值确实存在于对应Match中的行才会作为填充锚点;cumsum():将连续的同锚点行归为同一分组,避免跨锚点填充;groupby('group').ffill():仅对每个有效分组内的NaN进行前向填充,保证不符合条件的行(如Test行)保留原始空值。
内容的提问来源于stack exchange,提问作者user53526356
相关产品推荐
相关产品推荐

