2015-05-28 10 views
13

Sto cercando di trovare il conteggio di valori distinti in ciascuna colonna utilizzando Pandas. Questo è quello che ho fatto.Ricerca del conteggio di elementi distinti in DataFrame in ogni colonna

import pandas as pd 

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

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

conta elementi unici nel dataframe indipendentemente righe/colonne, ma necessario contare per ogni colonna con uscita formattato come sotto.

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 

quello che sarebbe il modo più efficace per fare questo, come questo metodo verrà applicato a file che hanno dimensioni superiori a 1,5 GB?


In base alle risposte, df.apply(lambda x: len(x.unique())) è il più veloce.

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 

risposta

16

Si potrebbe fare una trasposizione del df e quindi utilizzando apply chiamata nunique fila-saggio:

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 

EDIT

Come sottolineato dal @ajcr la trasposizione è inutile:

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

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

Come di panda 0,20 possiamo usare nunique direttamente sul dataframe cioè

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

Allo stesso modo penso 'df.apply (pd.Series.nunique)' potrebbe anche funzionare (e di evitare la necessità di recepire, se questo è un problema) . –

+0

@ajcr sì che è meglio in realtà, inizialmente pensavo che la trasposizione fosse necessaria per ottenere le colonne come valori di indice – EdChum

+0

Come contare il numero totale di occorrenze univoche? –

0

Recentemente, ho stessi problemi di conteggio valore unico di ogni colonna in dataframe, e ho trovato qualche altra funzione che corre più veloce della funzione di apply:

#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) 

Questo funziona per me quasi il doppio più veloce rispetto df.apply(lambda x: len(x.unique()))

0

già alcune grandi risposte qui :) ma questo sembra mancare:

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

E ancora meglio notizie, DataFrame.nunique() sarà nella versione 0.20.0: github of this issue

Problemi correlati