2014-11-17 29 views
45
df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'], 
        'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'], 
        'Col3': np.random.random(5)}) 

'Col1' ve 'Col2' benzersiz değerlerini döndürmenin en iyi yolu nedir? kullanılmasında():pandalar benzersiz değerler çoklu sütunlar

istenen çıkış pandas çözeltisi

'Bob', 'Joe', 'Bill', 'Mary', 'Steve' 

cevap

77

pd.unique bir giriş dizisinin, ya da DataFrame sütun veya dizininden benzersiz değerler verir.

Bu işlevin girdisi tek boyutlu olmalıdır, bu nedenle birden fazla sütunun birleştirilmesi gerekir. En basit yol, istediğiniz sütunları seçmek ve daha sonra değerleri düzleştirilmiş bir NumPy dizisinde görüntülemek. Bütün işlem aşağıdaki gibidir: ravel() getiri daha bir dizi yöntem, bir çok-boyutlu dizinin bir görünüşüdür (mümkünse) olan

>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K')) 
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object) 

Not olduğu. 'K' argümanı, diziyi elemanların bellekte saklanması sırasına göre düzleştirme yöntemini anlatır (pandalar genellikle Fortran-contiguous order'da altta yatan dizileri, satırlardan önceki sütunları depolar). Bu, yöntemin varsayılan 'C' sırasını kullanmaktan önemli ölçüde olabilir. yöntem çok boyutlu diziler kolları olarak burada ravel() kullanmaya gerek

>>> np.unique(df[['Col1', 'Col2']].values) 
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object) 

yok:


alternatif bir yolu sütunları seçin ve np.unique onları geçmektir. Yine de, bu, benzersiz değerleri tanımlamaktan ziyade sıralı bir algoritma kullanması nedeniyle pd.unique'dan daha yavaş olabilir.

hız farkı (benzersiz değerler sadece bir avuç, özellikle) büyük DataFrames için önemlidir:

>>> 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 
+0

'.önceki cevabınızdaki değerler gereklidir; aksi halde, dizi (['Col1', 'Col2'], dtype = '| S4') ' – congusbongus

+0

@congusbongus: bunu işaretlediğiniz için teşekkürler - cevabı güncelledim. Görünüşe göre Panda'nın/NumPy'nin bazı versiyonları için '.values' gereklidir (bunu NumPy 1.9.2 ve Pandas 15.2 ile test ediyordum ve çalışmamıştı). –

+1

Diziler yerine bir veri çerçevesini nasıl alırsınız? – Lisle

1

dışı olduğunu.

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'], 
       'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'], 
       'Col3' : np.random.random(5)}) 

print df 

print set(df.Col1.append(df.Col2).values) 

Çıktı:

Col1 Col2  Col3 
0 Bob Joe 0.201079 
1 Joe Steve 0.703279 
2 Bill Bob 0.722724 
3 Mary Bob 0.093912 
4 Joe Steve 0.766027 
set(['Steve', 'Bob', 'Bill', 'Joe', 'Mary']) 
4

Ben kurulum var 's sütunlarında birkaç basit dizeleri ile DataFrame:

>>> df 
    a b 
0 a g 
1 b h 
2 d a 
3 e e 

Sen ilgilenen sütunları bitiştirmek ve unique işlevini çağırabilirsiniz :

>>> pandas.concat([df['a'], df['b']]).unique() 
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object) 
3
In [5]: set(df.Col1).union(set(df.Col2)) 
Out[5]: {'Bill', 'Bob', 'Joe', 'Mary', 'Steve'} 

veya:

set(df.Col1) | set(df.Col2) 
İlgili konular