2013-03-14 3 views
106

Я использую pandas как замену db, поскольку у меня есть несколько баз данных (oracle, mssql и т. Д.), И я не могу сделать последовательность команд эквивалентом SQL.Pandas count (отдельный) эквивалент

У меня есть таблица, загруженная в DataFrame с некоторыми столбцами:

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

В SQL для подсчета количества различных клиентов в год будет:

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

И результат будет

201301 5000 
201302 13245 

Как я могу это сделать в пандах?

+0

Я сделал table.groupby ([ «годМесяц»]) [ «CLIENTCODE»] Уникальный() и пришел с двумя рядами индексируется годМесяц и со всеми уникальными значениями.. Как подсчитать количество значений в каждой серии? –

+0

Для некоторых, 'value_counts' может быть ответом, который вы ищете: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html –

ответ

183

Я считаю, что это то, что вы хотите:

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

Пример:

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

Нет необходимости в' .apply' , Я думаю; '.CLIENTCODE.nunique()' тоже должен работать. – DSM

+0

Ha. Ну, это звучит более удовлетворительно. Ура! –

+1

.column.unique() также является опцией ... – reabow

24

Интересно, что очень часто len(unique()) в несколько раз (3x-15x) быстрее, чем nunique().

+5

Вы имеете в виду это? '.CLIENTCODE.apply (lambda x: len (x.unique())), из [здесь] (http://stackoverflow.com/a/17926436/4015990) – Chen

+3

Мне нравится использовать' unique(). Shape [ 0] '. – 3novak

19

Вот еще один способ, очень простой, позволяет сказать, что ваше имя dataframe является daat и имя столбца YEARMONTH

daat.YEARMONTH.value_counts() 
+0

Мне нравится этот ответ. Как я могу использовать этот метод, если имя моего столбца имеет. в нем (например, «ck.Class»)? Спасибо – 2017-12-18 23:38:21

+1

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

+0

Это не касается заданного вопроса. –

-1

Добавления к богатым ответам выше, есть возможность писать запросы SQL на панду dataframe с питоном модуль под названием pandasql. Согласно 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.