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

当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

解决方案

实现思路

  1. 筛选出Matchup非空且该值确实存在于对应Match字符串中的行,作为填充锚点;
  2. 基于锚点对数据分组,连续的同锚点行归为一组;
  3. 仅对有效分组内的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:55:06