2013-03-14 20 views
106

Używam pand jako substytutu db, ponieważ mam wiele baz danych (oracle, mssql, itp.) I nie mogę wykonać sekwencji poleceń do odpowiednika SQL.Liczba pand (odpowiednik)

Mam tabeli załadowany w DataFrame z niektórych kolumnach:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc 

W SQL, aby policzyć ilość różnych klientów rocznie byłoby:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH; 

A wynik byłby

201301 5000 
201302 13245 

Jak mogę to zrobić w pandach?

+0

Zrobiłem table.groupby ([ „rokMiesiąc”]) [ „CLIENTCODE”] unikatowe() i przyszedł z dwóch serii indeksowanej przez rokMiesiąc i ze wszystkimi unikalnymi wartościami.. Jak policzyć ilość wartości w każdej serii? –

+0

Dla niektórych wartości 'value_counts' mogą być odpowiedziami, których szukasz: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html –

Odpowiedz

183

Wierzę, że to, co chcesz:

table.groupby('YEARMONTH').CLIENTCODE.nunique() 

Przykład:

In [2]: table 
Out[2]: 
    CLIENTCODE YEARMONTH 
0   1  201301 
1   1  201301 
2   2  201301 
3   1  201302 
4   2  201302 
5   2  201302 
6   3  201302 

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique() 
Out[3]: 
YEARMONTH 
201301  2 
201302  3 
+4

Nie ma potrzeby stosowania' .apply' , Myślę; '.CLIENTCODE.nunique()' powinno również działać. – DSM

+0

Ha. Cóż, i tak brzmi to bardziej satysfakcjonująco. Twoje zdrowie! –

+1

.column.unique() jest również opcją ... – reabow

24

Co ciekawe, bardzo często len(unique()) jest kilka razy (3x-15x) szybciej niż nunique().

+5

Masz na myśli to? '.CLIENTCODE.apply (lambda x: len (x.unique()))', od [tutaj] (http://stackoverflow.com/a/17926436/4015990) – Chen

+3

Lubię używać 'unique(). Shape [ 0] '. – 3novak

19

Oto kolejna metoda, znacznie proste, powiedzmy, że imię i nazwisko dataframe jest daat i nazwa kolumny jest YEARMONTH

daat.YEARMONTH.value_counts() 
+0

Podoba mi się ta odpowiedź. Jak korzystać z tej metody, jeśli moja nazwa kolumny zawiera znak "." w nim (np. "ck.Class")? Dzięki –

+1

daat ['ck.Class']. Value_counts() – Enthusiast

+0

To nie rozwiązuje zadanego pytania. –

-1

Dodawanie do bogatych odpowiedzi powyżej, istnieje możliwość pisać zapytań SQL na pandy dataframe z pytona moduł o nazwie pandasql. Według Yhat:

pandasql allows you to query pandas DataFrames using SQL syntax.[...] pandasql seeks to provide a more familiar way of manipulating and cleaning data for people new to Python or pandas.