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()
运行后输出的结果如下:
| COMB | FROM | TO | TYPE |
|---|---|---|---|
| PNR1 | MAA | BLR | R |
| PNR1 | BLR | MAA | O |
| PNR11 | DEL | MAA | O |
| PNR2 | TRV | HYD | R |
| PNR2 | HYD | TRV | O |
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
相关产品推荐
相关产品推荐

