pd.unique
函数用于从输入数组或DataFrame列或索引中返回唯一值。
此函数的输入必须是一维的,因此需要合并多个列。最简单的方法是选择所需的列,然后在展平的NumPy数组中查看值。 整个操作看起来像这样:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
注意
ravel()
是一个数组方法,如果可能的话返回一个多维数组的视图。参数
'K'
告诉方法按照存储在内存中的元素顺序来展开数组(Pandas通常以
Fortran连续顺序存储底层数组;列在行之前)。相比使用该方法的默认 'C' 顺序,这样做可以显著提高速度。
另一种方法是选择列并将它们传递给
np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
在这里没有必要使用ravel()
方法,因为该方法可以处理多维数组。即使如此,这种方法比pd.unique
方法更慢,因为它使用基于排序的算法而不是哈希表来确定唯一值。
对于较大的数据框(特别是如果只有少数唯一值),速度差异显著:
>>> df1 = pd.concat([df]*100000, ignore_index=True)
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel())
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
。 - Paul Rougieux