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

如何在Pandas中根据id是否含a和b生成指示列?

问题:在Pandas中为每个ID标记是否同时包含'a'和'b'

我有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({'id': [1,1,1,2,2,3,3,3],
                   'col': ['a','a','a','a','b','c','b','a']})

原始数据结构:

idcol
01a
11a
21a
32a
42b
53c
63b
73a

我希望新增一个indicator列,标记每个id对应的col中是否同时包含'a'和'b',满足条件则标记为1,否则为0。期望输出如下:

result = pd.DataFrame({'id': [1,1,1,2,2,3,3,3],
                       'col': ['a','a','a','a','b','c','b','a'], 
                       'indicator': [0,0,0,1,1,1,1,1]})

对应的结果表格:

idcolindicator
01a0
11a0
21a0
32a1
42b1
53c1
63b1
73a1

解决方案

方法1:使用groupby + transform

通过分组后判断每个组是否同时包含'a'和'b',再用transform将结果广播到每一行:

# 分组后检查每个组的col集合是否同时包含a和b
df['indicator'] = df.groupby('id')['col'].transform(
    lambda x: 1 if {'a', 'b'}.issubset(x.unique()) else 0
)

方法2:使用groupby + merge

先对每个id计算是否满足条件,再合并回原DataFrame:

# 计算每个id的indicator值
id_indicator = df.groupby('id')['col'].apply(
    lambda x: 1 if {'a', 'b'}.issubset(x.unique()) else 0
).reset_index(name='indicator')

# 合并到原表
df = df.merge(id_indicator, on='id', how='left')

方法3:更高效的向量化实现

如果数据量较大,可通过crosstab生成标记矩阵,再判断条件:

# 生成每个id是否包含a和b的矩阵
cross = pd.crosstab(df['id'], df['col']).ge(1)
# 同时包含a和b则为1
cross['indicator'] = (cross['a'] & cross['b']).astype(int)
# 合并回原表
df = df.merge(cross['indicator'], on='id', how='left')

以上三种方法都能得到期望的结果,其中方法1代码最简洁,方法3在大数据集下效率更高。


内容的提问来源于stack exchange,提问作者quant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:30:50