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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:36:56