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

Pandas按COMB列分组后对比相邻行FROM与TO列生成新列求解

报错原因

你遇到的报错和逻辑不符合需求的问题源于两个错误:

  • 分组操作内直接调用全局md的列数据,没有使用分组后的组内子集,导致返回值长度和组内索引长度不匹配,触发ValueError
  • 原有逻辑用isin判断当前FROM是否存在于组内所有TO值中,和你要求的「仅匹配同组下一行的TO值」逻辑不符

原生pandas实现方案(无需第三方依赖)

使用groupby配合shift(-1)实现组内行偏移匹配,shift(-1)会将列数据向上偏移1行,刚好取到当前行下一行的对应值,组内最后一行偏移后为NaN,自然匹配失败返回O:

import pandas as pd
import numpy as np

# 原始数据构造
data={'COMB':["PNR1", "PNR1", "PNR11", "PNR2", "PNR2"],
    'FROM':["MAA", "BLR", "DEL", "TRV", "HYD"],
     'TO':["BLR", "MAA", "MAA", "HYD", "TRV"]}
md=pd.DataFrame(data)

# 新增TYPE列
md['TYPE'] = md.groupby('COMB', group_keys=False).apply(
    lambda df: np.where(df['FROM'] == df['TO'].shift(-1), 'R', 'O')
).tolist()

运行后输出的结果如下:

COMBFROMTOTYPE
PNR1MAABLRR
PNR1BLRMAAO
PNR11DELMAAO
PNR2TRVHYDR
PNR2HYDTRVO

dfply类dplyr语法修正方案

如果你习惯使用类SQL的链式操作,只需要把原有代码里的全局md替换为指代分组内数据的X,同时把isin改为下一行偏移匹配即可:

from dfply import *
import numpy as np

md_merged = (md >>
            group_by('COMB') >>
            mutate(TYPE = np.where(X['FROM'] == X['TO'].shift(-1), "R", "O")) >>
            ungroup())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:08