问题:等效的熊猫数(不同)
我使用pandas作为数据库替代品,因为我有多个数据库(oracle,mssql等),并且无法对SQL等效命令进行一系列命令。
我在DataFrame中加载了一个带有一些列的表:
YEARMONTH, CLIENTCODE, SIZE, .... etc etc
在SQL中,每年计算不同客户端的数量将是:
SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;
结果将是
201301 5000
201302 13245
如何在熊猫中做到这一点?
回答 0
我相信这就是您想要的:
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
回答 1
这是另一种方法,非常简单,可以说您的数据框名称为daat
,列名称为YEARMONTH
daat.YEARMONTH.value_counts()
回答 2
有趣的是,通常len(unique())
速度比快几倍(3x-15x)nunique()
。
回答 3
使用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
回答 4
我也在使用,nunique
但是如果您必须使用诸如'min', 'max', 'count' or 'mean'
etc之类的聚合函数,它将非常有帮助。
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
回答 5
使用新的Pandas版本,很容易获得数据框
unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))
回答 6
这是一种在多个列上具有不同计数的方法。让我们来一些数据:
data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
'PRODUCT_CODE': [100,150,220,400,50,80,100]
}
table = pd.DataFrame(data)
table
CLIENT_CODE YEAR_MONTH PRODUCT_CODE
0 1 201301 100
1 1 201301 150
2 2 201301 220
3 1 201302 400
4 2 201302 50
5 2 201302 80
6 3 201302 100
现在,列出感兴趣的列,并使用经过稍微修改的语法的groupby:
columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()
我们获得:
YEAR_MONTH PRODUCT_CODE CLIENT_CODE
1 2 3
2 2 3
3 1 1
回答 7
列的不同以及其他列上的聚合
要获取任何列(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)