Python pandas按id分组查找最后一条bill记录生成newtype列实现
Pandas 按分组取指定条件最后一条值回填全列的实现方法
核心实现逻辑
- 先从原表中筛出所有满足
skill == 'bill'的行,提前剔除无关数据减少计算量 - 按
id字段分组后,取每组内最后一条满足条件的记录对应的type值,构建id与目标值的映射关系 - 将映射关系匹配回原表的
id列,直接生成newtype新列
可直接复用的代码
import pandas as pd # 示例输入数据 df = pd.DataFrame({ "id": [1, 1, 1, 2, 2, 3, 3, 3, 4], "skill": ['cc', 'bill', 'cc', 'cc', 'bill', 'a', 'bill', 'bill', 'bill'], "type": ['a', 'a', 'b', 'b', 'a', 'a', 'a', 'b', 'a'] }) # 构建每个id对应的newtype映射表 id_target_map = ( df[df['skill'] == 'bill'] .groupby('id') .tail(1) # 取每个id组内最后一条bill类型的记录 .set_index('id')['type'] ) # 生成新列 df['newtype'] = df['id'].map(id_target_map)
运行结果验证
执行上述代码后,输出的表结构和数值与预期完全匹配:
id skill type newtype 0 1 cc a a 1 1 bill a a 2 1 cc b a 3 2 cc b a 4 2 bill a a 5 3 a a b 6 3 bill a b 7 3 bill b b 8 4 bill a a
注意事项
- 相比对全表逐组做apply过滤的写法,这种先筛后分组的方式处理大表时效率更高
- 如果数据中存在部分id组完全没有
skill == 'bill'的记录,匹配后这些行的newtype会是NaN,可按需用fillna()补充默认值,例如:# 给没有bill记录的行填充默认值'unknown' df['newtype'] = df['id'].map(id_target_map).fillna('unknown')
内容的提问来源于stack exchange,提问作者goosepea
相关产品推荐
相关产品推荐

