2015-05-28 21 views
13

Ich versuche, die Anzahl der verschiedenen Werte in jeder Spalte mit Pandas zu finden. Das habe ich getan.Anzahl der verschiedenen Elemente in DataFrame in jeder Spalte finden

import pandas as pd 

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

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

Es zählt einzigartige Elemente in dem Datenrahmen, unabhängig von Zeilen/Spalten, aber ich brauche für jede Spalte mit einer Leistung, wie unten formatiert zu zählen.

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 

Was wäre der effizienteste Weg, dies zu tun, da diese Methode, um Dateien angewandt werden, die eine Größe von mehr als 1,5 GB hat?


Basierend auf den Antworten ist df.apply(lambda x: len(x.unique())) der schnellste.

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 

Antwort

16

Sie könnten eine Transponierung des df tun und dann mit apply Anruf nunique reihenweise:

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

Wie von @ajcr die Transponierung ist nicht notwendig:

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

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

Ab Pandas 0,20 können wir nunique direkt auf Datenrahmen d.h

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

Ähnlich denke ich 'df.apply (pd.Series.nunique)' würde auch funktionieren (und die Notwendigkeit zu transponieren, wenn das ein Problem ist) . –

+0

@ajcr ja, das ist eigentlich besser, zunächst dachte ich, dass die Transponierung notwendig war, um die Spalten als die Indexwerte zu erhalten – EdChum

+0

Wie man nur die Gesamtzahl der einzigartigen Vorkommen zählt? –

0

Vor kurzem habe ich dieselben Probleme mit einzigartigem Wert jeder Spalte in Datenrahmen zu zählen, und ich fand eine andere Funktion, die schneller läuft als die apply Funktion:

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

Dies funktioniert für mich fast zweimal schneller als df.apply(lambda x: len(x.unique()))

0

bereits einige großen Antworten hier :) aber diese scheinen zu fehlen:

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

Und noch besser Nachrichten, DataFrame.nunique() wird in Version 0,20.0: github of this issue

Verwandte Themen