Pandas按同ID其他行值条件标记DataFrame行的高效方法
高效向量化实现方案(无Python原生慢速循环)
核心思路是提前预存channel的配对映射,通过分组集合运算做存在性判断,所有核心操作均调用pandas底层C实现的接口,避免逐行Python循环,大数据量下性能优异。
完整实现代码
import pandas as pd # 输入初始数据 df_in = pd.DataFrame({ 'id': [0,1,2,2,3,4,4,4], 'channel': [0,1,0,1,3,2,3,1] }) allowed_channel_couples = ((0,1),(2,3)) # 1. 预构建channel配对映射字典:key为channel值,value为其对应的合法配对值 pair_map = {} for a, b in allowed_channel_couples: pair_map[a] = b pair_map[b] = a # 2. 为每行生成需要匹配的目标配对channel df_in['target_pair'] = df_in['channel'].map(pair_map) # 3. 按id分组,向量化判断当前行的目标配对是否存在于同id的channel集合中 df_in['flag'] = df_in.groupby('id', group_keys=False).apply( lambda group: group['target_pair'].isin(set(group['channel'])).astype(int) ) # 4. 删除临时列得到最终结果 df_out = df_in.drop(columns='target_pair')
结果验证
执行print(df_out)输出完全符合预期:
id channel flag 0 0 0 0 1 1 1 0 2 2 0 1 3 2 1 1 4 3 3 0 5 4 2 1 6 4 3 1 7 4 1 0
逻辑说明
- 预构建
pair_map的步骤仅需遍历一次允许配对列表,时间复杂度极低,后续所有判断都可以直接通过字典映射拿到对应配对值,无需重复遍历配对规则 - 分组后用
set存储同id下的channel值,存在性判断时间复杂度为O(1) - 所有判断逻辑均通过pandas内置的
map、groupby、isin接口实现,没有Python层面的逐行循环,性能比手写原生循环快1~2个数量级 - 后续如果需要新增允许配对规则,只需更新
allowed_channel_couples即可,无需修改核心判断逻辑,扩展性强
内容的提问来源于stack exchange,提问作者deppep
相关产品推荐
相关产品推荐

