使用Pandas筛选ID重复且stat值不同的记录
解决方法:筛选ID相同但stat值存在差异的记录
你的问题核心是要找出同一ID下stat值不唯一的所有记录,当前用df['ID'].duplicated()的问题在于:它只标记重复出现的ID行(排除首次出现的行),而且完全没考虑stat的差异,会误把ID重复但stat全相同的行也包含进来,同时漏掉目标ID的部分行。
正确的思路分两步:
- 第一步:找出所有“同一ID下stat值有多种取值”的ID
- 第二步:用这些ID过滤原DataFrame,保留对应所有行
具体代码实现
import pandas as pd # 构造测试数据 data = { 'ID': ['aaBBB1234:3716', 'aaBBB1234:3716', 'aaBBB1234:3716', 'bbSSS2333:5000', 'bbSSS2333:5000'], 'name': ['apv', 'mps', 'ty', 'teas', 'llv'], 'tag': ['eertyyuiiio', 'rtuui', 'fgggll1', 'dexcv', 'ieeve'], 'stat': [False, False, True, False, False] } df = pd.DataFrame(data) # 第一步:找出stat值不唯一的ID ids_with_varying_stat = df.groupby('ID')['stat'].nunique()[lambda x: x > 1].index # 第二步:筛选这些ID的所有记录 filtered_df = df[df['ID'].isin(ids_with_varying_stat)] print(filtered_df)
代码解释
df.groupby('ID')['stat'].nunique():按ID分组,计算每个ID下stat值的不同数量lambda x: x > 1:筛选出stat值数量大于1的ID(也就是同一ID下stat有差异)df['ID'].isin(ids_with_varying_stat):保留原DataFrame中ID属于上述列表的所有行
执行后得到的结果就是你期望的:仅保留ID为aaBBB1234:3716的所有记录。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

