使用Python Pandas标记同时含同色A、B类商品的交易ID
解决方案
我来帮你搞定这个需求!咱们要标记出那些同时包含category为A和B、且颜色相同的transaction_id对应的所有行,具体步骤如下:
1. 先构造示例数据(方便验证)
首先咱们先把你给出的示例数据转换成Pandas DataFrame:
import pandas as pd data = { 'product_id': [234, 349, 213, 490, 245, 249, 294], 'transaction_id': [54, 54, 46, 46, 87, 87, 87], 'category': ['A', 'B', 'A', 'A', 'A', 'B', 'A'], 'color': ['black', 'silver', 'silver', 'black', 'black', 'black', 'silver'] } df = pd.DataFrame(data)
2. 核心逻辑:标记符合条件的交易-颜色组合
我们可以通过按transaction_id和color分组,然后检查每个分组里是否同时包含'A'和'B'两个category。这里用transform方法可以直接把结果映射回原DataFrame的每一行:
# 分组后检查每组是否同时包含A和B,生成flag列 df['flag'] = df.groupby(['transaction_id', 'color'])['category'].transform( lambda x: {'A', 'B'}.issubset(x) )
3. 验证结果
运行后得到的DataFrame如下:
| product_id | transaction_id | category | color | flag |
|---|---|---|---|---|
| 234 | 54 | A | black | False |
| 349 | 54 | B | silver | False |
| 213 | 46 | A | silver | False |
| 490 | 46 | A | black | False |
| 245 | 87 | A | black | True |
| 249 | 87 | B | black | True |
| 294 | 87 | A | silver | False |
完全符合你的需求:交易87里的黑色商品(A类和B类)被标记为True,其他行都是False。
补充说明
- 用
{'A', 'B'}.issubset(x)比x.nunique() >=2更严谨,因为它明确检查是否同时包含A和B,避免出现其他category的干扰(如果有的话)。 - 如果你的数据量很大,这种分组transform的方法效率也很高,不需要额外的合并操作。
内容的提问来源于stack exchange,提问作者jeangelj
相关产品推荐
相关产品推荐

