如何用Pandas筛选并统计两类ID:仅含Purchased=1及值变化的ID
示例数据集
| ID | Purchased |
|---|---|
| 100 | 0 |
| 100 | 1 |
| 100 | 0 |
| 100 | 1 |
| 101 | 1 |
| 101 | 1 |
| 101 | 1 |
| 101 | 1 |
| 102 | 0 |
| 102 | 0 |
| 102 | 0 |
| 102 | 0 |
| 103 | 1 |
| 103 | 1 |
| 103 | 1 |
| 103 | 1 |
| 104 | 0 |
| 104 | 1 |
| 104 | 0 |
| 104 | 1 |
Pandas 定位并统计目标ID的解决方案
一、统计Purchased值仅为1的ID
用groupby结合all()或nunique()就能实现:
方法1:用all()判断组内所有值都是1
# 筛选组内所有Purchased都是1的ID only_1_ids = df.groupby('ID')['Purchased'].all() # 提取符合条件的ID列表 only_1_ids = only_1_ids[only_1_ids].index.tolist() print("Purchased仅为1的ID:", only_1_ids) # 统计数量 print("数量:", len(only_1_ids))
方法2:用nunique()判断组内唯一值只有1
# 获取每个ID对应的Purchased唯一值集合 id_unique_vals = df.groupby('ID')['Purchased'].unique() # 筛选唯一值仅为[1]的ID only_1_ids = id_unique_vals[id_unique_vals.apply(lambda x: len(x)==1 and x[0]==1)].index.tolist()
二、统计Purchased二进制值发生变化的ID
这类ID的核心特征是组内同时存在0和1,或者相邻行数值有切换。你之前用diff()的思路没问题,只是需要进一步判断组内是否存在变化,这里提供两种更直接的方法:
方法1:基于diff()判断组内有非0差值
# 计算组内相邻行的Purchased差值 df['diff'] = df.groupby('ID')['Purchased'].diff() # 筛选组内存在非空且非0差值的ID(即出现过值变化) changed_ids = df.groupby('ID')['diff'].apply(lambda x: (x.notna() & (x != 0)).any()).index.tolist() print("Purchased值发生变化的ID:", changed_ids) print("数量:", len(changed_ids))
方法2:直接判断组内唯一值数量大于1(更简洁)
因为二进制值变化意味着组内至少有0和1两种值,直接用nunique()判断即可:
changed_ids = df.groupby('ID')['Purchased'].nunique() changed_ids = changed_ids[changed_ids > 1].index.tolist()
完整可运行代码
import pandas as pd # 构造示例DataFrame data = { 'ID': [100,100,100,100,101,101,101,101,102,102,102,102,103,103,103,103,104,104,104,104], 'Purchased': [0,1,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,1,0,1] } df = pd.DataFrame(data) # 统计Purchased仅为1的ID only_1_ids = df.groupby('ID')['Purchased'].all()[lambda x: x].index.tolist() print(f"Purchased仅为1的ID:{only_1_ids},共{len(only_1_ids)}个") # 统计Purchased值发生变化的ID changed_ids = df.groupby('ID')['Purchased'].nunique()[lambda x: x>1].index.tolist() print(f"Purchased值发生变化的ID:{changed_ids},共{len(changed_ids)}个")
运行结果:
Purchased仅为1的ID:[101, 103],共2个 Purchased值发生变化的ID:[100, 104],共2个
内容的提问来源于stack exchange,提问作者Data1010
相关产品推荐
相关产品推荐

