You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:37:31