pd.unique
bir girdi dizisinden veya DataFrame sütunundan veya dizinden benzersiz değerleri döndürür.
Bu işlevin girdisinin tek boyutlu olması gerekir, bu nedenle birden çok sütunun birleştirilmesi gerekir. En basit yol, istediğiniz sütunları seçmek ve ardından değerleri düzleştirilmiş bir NumPy dizisinde görüntülemektir. Tüm operasyon şöyle gözüküyor:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
ravel()
Çok boyutlu bir dizinin bir görünümünü (mümkünse) döndüren bir dizi yöntemi olduğuna dikkat edin. Argüman 'K'
, yönteme, öğelerin bellekte saklandığı sıraya göre diziyi düzleştirmesini söyler (pandalar genellikle alttaki dizileri Fortran-bitişik sırayla depolar ; sütunlar satırlardan önce). Bu, yöntemin varsayılan 'C' sırasını kullanmaktan önemli ölçüde daha hızlı olabilir.
Alternatif bir yol, sütunları seçip şunlara iletmektir np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Kullanmaya gerek yok ravel()
Yöntem çok boyutlu dizileri işlediği burada . Öyle bile olsa, bu, pd.unique
benzersiz değerleri tanımlamak için bir hashtable yerine sıralama tabanlı bir algoritma kullandığından muhtemelen daha yavaş olacaktır .
Hızdaki fark, daha büyük DataFrame'ler için önemlidir (özellikle yalnızca birkaç benzersiz değer varsa):
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %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()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})