如何用Pandas筛选出amount列值不全相同的id?
筛选出amount列值不完全相同的ID的简洁实现方法
需求明确:找出所有对应amount值并非完全一致的ID——比如ID 1的amount是10、10、20,符合筛选条件;ID 2的amount全是5,就不用筛选。
先看原数据初始化代码:
import pandas as pd df = pd.DataFrame(data={"id":[1,1,1,2,2,3,3], "amount":[10,10,20,5,5,20,10]})
数据样例:
id amount
1 10
1 10
1 20
2 5
2 5
3 20
3 10
你原来的实现步骤偏繁琐,这里给你几种更简洁高效的写法:
方法1:用nunique统计唯一值数量
直接分组后统计每个ID下amount的唯一值个数,筛选个数大于1的ID即可:
differ_ids = df.groupby('id')['amount'].nunique()[lambda x: x > 1].index.tolist() print(differ_ids) # 输出: [1, 3]
方法2:通过标准差判断
如果某ID的amount全相同,标准差就是0;反之标准差大于0,用这个特性筛选:
differ_ids = df.groupby('id')['amount'].std().dropna()[lambda x: x > 0].index.tolist() print(differ_ids) # 输出: [1, 3]
(dropna是处理可能存在单个值的ID,避免标准差计算返回NaN)
方法3:比较最大值和最小值
如果某ID的amount最大值不等于最小值,说明存在不同值:
differ_ids = df.groupby('id')['amount'].agg(['max', 'min']).query('max != min').index.tolist() print(differ_ids) # 输出: [1, 3]
这几种方法都省去了原实现中merge和apply的冗余操作,直接通过分组聚合完成筛选,代码更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

