Pandas如何筛选b列值发生变化的对应id的全部行数据
pandas筛选b列发生变动的id对应全部行实现方法
核心思路
- 先识别所有
b列存在多个不同取值的id - 再从原数据中提取这些
id对应的所有行,即为目标结果
标准实现(通用场景)
import pandas as pd # 替换为你自己的数据读取代码,例如读取csv、数据库数据等 # df = pd.read_csv("your_dataset_path.csv") # 按id分组,统计每个id对应b列的唯一值数量,唯一值数>1即代表b列发生过变化 id_has_change = df.groupby('id')['b'].nunique() > 1 # 提取所有符合条件的目标id target_id_list = id_has_change[id_has_change].index # 过滤原表得到最终结果 final_result = df[df['id'].isin(target_id_list)]
该写法逻辑严谨,可以覆盖b列多次变动、首尾值巧合一致但中间存在变化的场景,适配绝大多数常规数据集。
大数据集优化写法
如果你的数据量达到百万、千万级,上述分组统计的写法内存开销较高,可以用去重逻辑降低计算量:
# 仅提取id和b两列去重,大幅降低待处理数据量 unique_id_b_pair = df[['id', 'b']].drop_duplicates() # 找出在去重结果中出现超过1次的id,即对应b列有变动的id target_id_list = unique_id_b_pair[unique_id_b_pair.duplicated('id', keep=False)]['id'].unique() # 过滤原表得到结果 final_result = df[df['id'].isin(target_id_list)]
效果验证
用测试样例验证逻辑:
假设原始测试数据如下:
| id | b | col3 |
|---|---|---|
| 1 | x | v1 |
| 1 | x | v2 |
| 2 | y | v3 |
| 2 | z | v4 |
| 3 | m | v5 |
| 3 | m | v6 |
运行代码后,id=1、id=3的b列全程无变动会被过滤,仅保留id=2的全部两行,和预期结果一致。
内容的提问来源于stack exchange,提问作者r_user
相关产品推荐
相关产品推荐

