最安全查唯一值应直接用 pandas.series.unique(),它保留原始顺序、正确处理 nan、支持所有 dtype;多列组合唯一需用 drop_duplicates();仅统计数量时优先用 nunique()。

直接用 pandas.Series.unique(),别碰 numpy.unique()
查唯一值最常用、最安全的方式就是调用 Series 的 .unique() 方法。它保留原始顺序、自动去重、支持任意 dtype(包括 None 和 NaN),而且返回的是 numpy 数组——后续能直接喂给绘图或建模代码。
常见错误是先转成 numpy.array 再调 numpy.unique():它会把 NaN 当成普通值排在开头,还强制排序,彻底打乱原始出现顺序;更糟的是,对含 datetime64 或 category 的列,numpy.unique() 可能静默失败或返回错误类型。
-
df["col"].unique()✅ 原始顺序 + 正确处理缺失值 -
np.unique(df["col"])❌ 重排序 +NaN位置错乱 + 类型风险 - 对
category列,.unique()返回CategoricalIndex,不是裸数组,注意后续是否要.tolist()
DataFrame 多列组合查唯一行,用 drop_duplicates() 而非 unique()
Series.unique() 不支持多列;想看哪几列组合起来有多少种不重复的组合,得靠 DataFrame.drop_duplicates() 配合 .shape[0] 或 .values。
例如查 "city" 和 "year" 联合唯一值数量:df[["city", "year"]].drop_duplicates().shape[0]。如果要拿到实际值,用 df[["city", "year"]].drop_duplicates().values,返回二维 numpy 数组。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 别写
df[["city","year"]].unique()—— 这会报AttributeError -
drop_duplicates()默认保留第一次出现的行,符合“唯一值”的直觉;加keep="last"可改行为,但一般不需要 - 大数据量时,
drop_duplicates(subset=[...])比先groupby(...).size()快得多,后者会触发完整分组计算
unique() 对 NaN 的处理很实在:只留一个,且不排序
Pandas 把 NaN 视为“缺失”,不是“值”,所以 .unique() 遇到多个 NaN 只返回一个 nan(注意是小写),且固定放在结果数组末尾(除非原序列里 NaN 是第一个出现的)。
这和 SQL 的 DISTINCT 一致,也和大多数分析直觉吻合。但如果你依赖“NaN 总在最后”做索引切片,得小心:如果原始 Series 全是 NaN,.unique() 就只返回 [nan],长度为 1 —— 容易在条件判断里漏掉。
-
pd.Series([1, 2, np.nan, 2, np.nan]).unique()→array([1., 2., nan]) -
pd.Series([np.nan, 1, np.nan]).unique()→array([nan, 1.])(NaN出现在最前,因它是首次出现) - 需要稳定排除
NaN?用ser.dropna().unique(),别用布尔索引ser[ser.notna()].unique(),后者稍慢
性能敏感场景:大字符串列慎用 unique(),优先考虑 nunique()
当你其实只关心“有多少个唯一值”,而不是“是哪些值”,直接用 Series.nunique()。它底层跳过构造完整数组,尤其对 object 类型(比如长文本、URL)快 3–10 倍,内存占用也低得多。
典型误用是:先 vals = ser.unique(),再 len(vals)。这等于白建一个可能上百万元素的数组,只为取个长度。
- 统计数量 → 用
ser.nunique()(默认跳过NaN;加dropna=False可包含) - 要枚举值 → 才用
ser.unique(),但记得预估内存:100 万条短字符串,.unique()结果数组可能占几十 MB - 对
category列,.nunique()和.unique()都极快,因为底层已维护了唯一编码表
df["user_id"].unique()。真正容易出问题的,是混用 numpy/pandas 行为、多列误调、以及没想清楚到底要“值”还是要“数量”。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










