2015-05-28 28 views
13

Pandaları kullanarak her sütunda farklı değerlerin sayısını bulmaya çalışıyorum. Yaptığım buydu.Her sütunda DataFrame'de farklı öğelerin sayısını bulma

import pandas as pd 

df = pd.read_csv('train.csv') 
# print(df) 

a = pd.unique(df.values.ravel()) 
print(a) 

O bakılmaksızın satır/sütun DataFrame benzersiz unsurları sayar, ama aşağıda olarak biçimlendirilmiş çıkışı ile her sütun için saymak gerekir. Bu yöntem 1.5GB daha büyük boyuta sahip dosyaları uygulanacak olarak

policyID    0 
statecode    0 
county    0 
eq_site_limit   0 
hu_site_limit   454 
fl_site_limit   647 
fr_site_limit   0 
tiv_2011    0 
tiv_2012    0 
eq_site_deductible 0 
hu_site_deductible 0 
fl_site_deductible 0 
fr_site_deductible 0 
point_latitude  0 
point_longitude  0 
line     0 
construction   0 
point_granularity  0 

Ne, bunu yapmanın en etkili yolu olurdu?


Yanıtlara dayanarak, df.apply(lambda x: len(x.unique())) en hızlıdır.

In[23]: %timeit df.apply(pd.Series.nunique) 
1 loops, best of 3: 1.45 s per loop 
In[24]: %timeit df.apply(lambda x: len(x.unique())) 
1 loops, best of 3: 335 ms per loop 
In[25]: %timeit df.T.apply(lambda x: x.nunique(), axis=1) 
1 loops, best of 3: 1.45 s per loop 

cevap

16

Bir df devrik ardından nunique sıra sıra apply çağrısı kullanarak yapabileceği:

olarak @ajcr devrik ile işaret

In [205]: 
df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]}) 
df 

Out[205]: 
    a b c 
0 0 1 1 
1 1 2 1 
2 1 3 1 
3 2 4 1 
4 3 5 1 

In [206]: 
df.T.apply(lambda x: x.nunique(), axis=1) 

Out[206]: 
a 4 
b 5 
c 1 
dtype: int64 

DÜZENLEME gereksizdir:

In [208]: 
df.apply(pd.Series.nunique) 

Out[208]: 
a 4 
b 5 
c 1 
dtype: int64 

pandalar 0.20 itibariyle biz

df.nunique() 
a 4 
b 5 
c 1 
dtype: int64 
+5

versiyonunda olacaktır. Aynı şekilde df.apply (pd.Series.nunique) 'nin de çalışacağını düşünüyorum (ve eğer bir sorun varsa, transpoze ihtiyacını ortadan kaldırır) . –

+0

@ajcr evet aslında daha iyi, başlangıçta, transpozisyonun sütunları indeks değerleri olarak elde etmek için gerekli olduğunu düşündüm – EdChum

+0

Toplam benzersiz olay sayısı nasıl sayılır? –

2

A Pandas.Series istediğiniz tam olarak ne sağlayan bir .value_counts() işlevi vardır dataframe yani doğrudan nunique kullanabilirsiniz. Check out the documentation for the function. Son zamanlarda

+0

Hiçbir kod ve çıktı göndermediğinizde bunun nasıl görüneceğini gösterir misiniz? – EdChum

0

, ben DataFrame her sütunun benzersiz değeri sayma aynı sorunları var ve hızlı apply işlevinden daha çalışır diğer bazı fonksiyonu bulundu: neredeyse iki daha hızlı df.apply(lambda x: len(x.unique()))

#Select the way how you want to store the output, could be pd.DataFrame or Dict, I will use Dict to demonstrate: 
col_uni_val={} 
for i in df.columns: 
    col_uni_val[i] = len(df[i].unique()) 

#Import pprint to display dic nicely: 
import pprint 
pprint.pprint(col_uni_val) 

Bu benim için çalışıyor

df.apply(lambda x: x.nunique()) 

Ve daha da iyi:

0

Zaten burada bazı büyük cevaplar :) ama bu bir eksik gibi görünüyor Haberler, DataFrame.nunique(), 0.20.0: github of this issue

İlgili konular