Adr*_*ida 245 python group-by count distinct pandas
我使用pandas作为db替代品,因为我有多个数据库(oracle,mssql等),我无法为SQL等价物创建一系列命令.
我在DataFrame中加载了一些表,其中包含一些列:
YEARMONTH, CLIENTCODE, SIZE, .... etc etc
Run Code Online (Sandbox Code Playgroud)
在SQL中,要计算每年不同客户端的数量,请执行以下操作:
SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;
Run Code Online (Sandbox Code Playgroud)
结果就是
201301 5000
201302 13245
Run Code Online (Sandbox Code Playgroud)
我怎么能在熊猫中做到这一点?
Dan*_*lan 371
我相信这就是你想要的:
table.groupby('YEARMONTH').CLIENTCODE.nunique()
Run Code Online (Sandbox Code Playgroud)
例:
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
Run Code Online (Sandbox Code Playgroud)
Ent*_*ast 72
这是另一种方法,很简单,假设你的数据框名称daat
和列名是YEARMONTH
daat.YEARMONTH.value_counts()
Run Code Online (Sandbox Code Playgroud)
Rom*_* Kh 41
有趣的是,通常len(unique())
比...快几倍(3x-15x)nunique()
.
Viv*_*asi 17
要获取任何列(在您的情况下)的不同数量的值CLIENTCODE
,我们可以使用nunique
. 我们可以将输入作为agg
函数中的字典传递,以及其他列上的聚合:
grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
'other_col_1': ['sum', 'count']})
# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]
# if you wish to reset the index
grp_df.reset_index(inplace=True)
Run Code Online (Sandbox Code Playgroud)
Gan*_*aju 12
我也在使用,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
Run Code Online (Sandbox Code Playgroud)
使用crosstab
,这将返回比groupby
nunique
以下更多的信息:
pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]:
CLIENTCODE 1 2 3
YEARMONTH
201301 2 1 0
201302 1 2 1
Run Code Online (Sandbox Code Playgroud)
稍加修改后,结果如下:
pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]:
YEARMONTH
201301 2
201302 3
dtype: int64
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
313436 次 |
最近记录: |