在Python Pandas中按ID统计COL1唯一值并排除LACK值
Pandas实现按ID统计排除指定值后的唯一值数量
示例数据构造
先还原你提供的DataFrame:
import pandas as pd data = { 'ID': ['123', '123', '123', '456', '456', '77', '88', '66', '66'], 'COL1': ['XX', 'XX', 'L', 'AP', 'AP', 'C', 'LACK', 'LACK', 'G'] } df = pd.DataFrame(data)
实现代码
通过groupby结合transform即可快速完成需求,核心逻辑是按ID分组后,过滤掉COL1中的"LACK"值,再统计剩余值的唯一数量:
# 计算每个ID分组排除LACK后的唯一值数,并映射到每一行 df['COL1_bis'] = df.groupby('ID')['COL1'].transform(lambda x: x[x != 'LACK'].nunique())
结果验证
执行后得到的DataFrame与你期望的一致:
| ID | COL1 | COL1_bis |
|---|---|---|
| 123 | XX | 2 |
| 123 | XX | 2 |
| 123 | L | 2 |
| 456 | AP | 1 |
| 456 | AP | 1 |
| 77 | C | 1 |
| 88 | LACK | 0 |
| 66 | LACK | 1 |
| 66 | G | 1 |
逻辑说明
groupby('ID')['COL1']:按ID对COL1列分组,确保同一ID的所有行被归为一组transform:将分组计算的结果广播到原DataFrame的每一行,保证同一ID的行拥有相同的统计值x[x != 'LACK'].nunique():先过滤当前组中等于"LACK"的元素,再统计剩余元素的唯一值数量;若组内只剩"LACK",过滤后为空,nunique()返回0,完全匹配需求
内容的提问来源于stack exchange,提问作者unbik
相关产品推荐
相关产品推荐

