Pandas счетчик (отдельный) эквивалент

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

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

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

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

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

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

201301    5000
201302    13245

Как это сделать в pandas?

Ответ 1

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

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

Ответ 2

Вот еще один простой способ: скажем, имя вашего фрейма daat и имя столбца YEARMONTH

daat.YEARMONTH.value_counts()

Ответ 3

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

Ответ 4

Используя crosstab, это вернет больше информации, чем groupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

После небольшого изменения получим результат

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

Ответ 5

Возможно, это лучше всего подходит для вашего запроса.

print(YEARMONTH['CLIENTCODE'].unique())

и GROUPBY считаются

print(YEARMONTH.groupby('CLIENTCODE').size())

Ответ 6

Я также использую nunique, но будет очень полезно, если вам придется использовать агрегатную функцию, такую как 'min', 'max', 'count' or 'mean' и т.д.

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

Ответ 7

С новой версией панд легко получить как фрейм данных

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

Ответ 8

Добавив к богатым ответам выше, есть возможность записать SQL-запросы в Pandas dataframe с помощью модуля python под названием pandasql. Согласно Yhat:

pandasql позволяет вам запрашивать Pandas DataFrames с использованием синтаксиса SQL. [...] pandasql стремится обеспечить более привычный способ манипулирования и очистка данных для людей, новых для Python или pandas.