Pandas列值拼接生成新字段时如何排除满足指定条件的记录
问题解决方案
你原有代码存在两个待优化点:
- 未实现分组内排除
Cond=True记录的逻辑 - 拼接后缀时取的是当前行的
Code,而非分组内最新记录的Code,也没有保证同ID所有行的Sequence值完全一致
可直接运行的修改后代码
import pandas as pd def gen_sequence(group): # 过滤分组内Cond为True的无效记录 valid = group[~group['Cond']] # 对有效年份升序排序后拼接(与你示例输出的年份顺序匹配) year_str = 'x'.join(sorted(valid['Year'].astype(str))) # 取分组内Year最大的最新记录对应的Code latest_code = valid.loc[valid['Year'].idxmax(), 'Code'] # 同分组所有行返回相同的Sequence值 return pd.Series([f"{year_str}_{latest_code}"] * len(group), index=group.index) df['Sequence'] = df.groupby('ID', group_keys=False).apply(gen_sequence)
逻辑说明
- 按
ID分组后对每个分组独立处理 - 先过滤掉分组内
Cond为True的记录,只保留有效行用于计算 - 对有效行的
Year字段排序后用x拼接成年份部分 - 取有效行中
Year最大值对应的Code作为后缀,用下划线拼接在年份部分后 - 给分组内所有行返回相同的计算结果,保证同ID的
Sequence完全一致
如果你需要年份按降序拼接,把sorted改成sorted(..., reverse=True)即可。
内容的提问来源于stack exchange,提问作者Jan Valušek
相关产品推荐
相关产品推荐

