unique()

294 阅读3分钟

unique() 是 pandas 中常用的函数,它可以用于多种对象类型,包括 SeriesIndexGroupBy 等。通过 unique(),可以获取不同数据类型的唯一值。接下来将详细列举并分析 unique() 在不同上下文中的使用。

1. pandas.Series.unique()

Series.unique() 用于返回一个 Series 中的唯一值。它会返回一个 numpy 数组,其中包含 Series 中所有不重复的元素。

示例:

import pandas as pd

# 创建 Series
s = pd.Series([1, 2, 2, 3, 4, 4, 5])

# 获取唯一值
unique_values = s.unique()
print(unique_values)
输出:
[1 2 3 4 5]

解释:

  • s.unique() 返回了 Series 中所有唯一的值。注意,它会去除重复元素,并且返回一个 numpy 数组。

2. pandas.Index.unique()

Index.unique() 用法与 Series.unique() 类似,但是用于 Index 对象。它返回唯一的索引值。

示例:

# 创建 Index
index = pd.Index([1, 2, 2, 3, 4, 4, 5])

# 获取唯一值
unique_values = index.unique()
print(unique_values)
输出:
Int64Index([1, 2, 3, 4, 5], dtype='int64')

解释:

  • index.unique() 返回了 Index 中的唯一元素,并且它的返回类型是 Int64Index(或其它合适的 Index 类型)。

3. pandas.api.extensions.ExtensionArray.unique()

pandas.api.extensions.ExtensionArray 是 pandas 中用于扩展数据类型(如 Categorical 类型等)的一种抽象类。ExtensionArray 是 pandas 中的底层数组对象,支持 unique() 方法。与 SeriesIndex 类似,ExtensionArray.unique() 返回的是去重后的唯一值。

示例:

import pandas as pd

# 创建 Categorical Series
cat_s = pd.Series(["a", "b", "a", "c", "b"], dtype="category")

# 获取唯一值
unique_values = cat_s.cat.categories.unique()
print(unique_values)
输出:
Index(['a', 'b', 'c'], dtype='object')

解释:

  • cat_s.cat.categories.unique() 获取的是 Categorical 数据类型的唯一值。

4. pandas.core.groupby.SeriesGroupBy.unique()

SeriesGroupBy.unique() 用于在 GroupBy 对象上调用 unique(),即它会对每个分组的 Series 进行去重,返回每个分组中的唯一值。

示例:

# 创建 DataFrame
df = pd.DataFrame({
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [1, 2, 2, 3, 1, 3]
})

# 按 'Category' 分组,并获取每组的唯一值
grouped = df.groupby('Category')['Value']
unique_values = grouped.unique()
print(unique_values)
输出:
Category
A    [1, 2]
B    [2, 3]
Name: Value, dtype: object

解释:

  • groupby 对象上,unique() 方法会返回每个组(Category)中的唯一值。

5. pandas.unique()

pandas.unique() 是一个全局函数,适用于 SeriesIndex 或数组。它返回唯一值,与 Series.unique()Index.unique() 的效果类似。

示例:

# 使用 pandas.unique() 获取唯一值
unique_values = pd.unique([1, 2, 2, 3, 4, 4, 5])
print(unique_values)
输出:
[1 2 3 4 5]

解释:

  • pd.unique() 可以直接用于列表、SeriesIndex,返回不重复的唯一值。它返回的结果是一个 numpy 数组。

6. pandas.Series.unique()pandas.Index.unique() 的对比

  • pandas.Series.unique() 返回的是一个 numpy 数组,而 pandas.Index.unique() 返回的是一个 Index 类型的数据结构(通常是 Int64IndexFloat64IndexDatetimeIndex 或其它类型的 Index)。
  • Index 是 pandas 中用于表示标签的结构,因此它的返回值会保持 Index 类型,而 Series 的返回值通常是 numpy.ndarray 类型。

7. pandas.Index.unique()pandas.api.extensions.ExtensionArray.unique() 的对比

  • pandas.Index.unique() 返回的是去重后的唯一索引值,而 pandas.api.extensions.ExtensionArray.unique() 是对 pandas 扩展数组(例如 Categorical 类型)应用的 unique() 方法。ExtensionArray.unique() 可能返回不同类型的数组(例如 CategoricalDatetimeIndex),具体取决于底层数据的类型。

8. 总结

  • pandas.Series.unique() : 用于获取 Series 中的唯一值,返回 numpy.ndarray
  • pandas.Index.unique() : 用于获取 Index 中的唯一值,返回 Index 类型。
  • pandas.api.extensions.ExtensionArray.unique() : 用于扩展类型的数组(如 Categorical)获取唯一值。
  • pandas.core.groupby.SeriesGroupBy.unique() : 用于在 GroupBy 对象上获取每个组的唯一值。
  • pandas.unique() : 直接调用该函数也可以获取唯一值,适用于 SeriesIndex 或数组。

在实际使用中,选择哪一个方法取决于你正在处理的数据类型及其上下文。