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.