熊猫数(不同)相当于

时间:2013-03-14 13:50:03

标签: python pandas count group-by distinct

我使用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

我怎么能在熊猫中做到这一点?

11 个答案:

答案 0 :(得分:321)

我相信这就是你想要的:

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 :(得分:59)

这是另一种方法,很简单,假设您的数据框名称为daat,列名为YEARMONTH

daat.YEARMONTH.value_counts()

答案 2 :(得分:36)

有趣的是,len(unique())通常比nunique()快几倍(3x-15x)。

答案 3 :(得分:2)

列的不同以及其他列上的聚合

要获取任何列(在您的情况下为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)

答案 4 :(得分:1)

使用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 :(得分:1)

我也在使用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

答案 6 :(得分:0)

使用新的pandas版本,很容易将其作为数据框获取

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

答案 7 :(得分:0)

这里有一种方法可以对多个列进行计数。让我们有一些数据:

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

答案 8 :(得分:0)

现在您也可以在 python 中使用 dplyr 语法来做到这一点:

>>> from datar.all import f, tibble, group_by, summarise, n_distinct
>>> 
>>> data = tibble(
...     CLIENT_CODE=[1,1,2,1,2,2,3],
...     YEAR_MONTH=[201301,201301,201301,201302,201302,201302,201302]
... )
>>> 
>>> data >> group_by(f.YEAR_MONTH) >> summarise(n=n_distinct(f.CLIENT_CODE))
   YEAR_MONTH       n
      <int64> <int64>
0      201301       2
1      201302       3

我是 datar 包的作者。如果您有任何问题,请随时提交问题。

答案 9 :(得分:0)

创建一个数据透视表并使用 nunique 系列函数

ID=[ 123, 123, 123, 456, 456, 456, 456, 789, 789] 
domain=['vk.com', 'vk.com', 'twitter.com', 'vk.com', 'facebook.com',
'vk.com', 'google.com', 'twitter.com', 'vk.com']
df=pd.DataFrame({'id':ID,'domain':domain})
fp=pd.pivot_table(data=df,index='domain',aggfunc=pd.Series.nunique)
print(fp)

输出:

               id
domain          
facebook.com   1
google.com     1
twitter.com    2
vk.com         3

答案 10 :(得分:-1)

尝试

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

和GROUPBY计为

print(YEARMONTH.groupby('CLIENTCODE').size())
相关问题