Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫计数(不同)当量_Python_Pandas_Count_Group By_Distinct - Fatal编程技术网

Python 熊猫计数(不同)当量

Python 熊猫计数(不同)当量,python,pandas,count,group-by,distinct,Python,Pandas,Count,Group By,Distinct,我使用pandas作为db替代品,因为我有多个数据库(oracle、mssql等),并且我无法将命令序列转换为SQL等效项 我在数据框中加载了一个表,其中包含一些列: YEARMONTH, CLIENTCODE, SIZE, .... etc etc 在SQL中,计算每年不同客户端的数量应为: SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH; 结果是 201301 5000 201302 13245

我使用pandas作为db替代品,因为我有多个数据库(oracle、mssql等),并且我无法将命令序列转换为SQL等效项

我在数据框中加载了一个表,其中包含一些列:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc
在SQL中,计算每年不同客户端的数量应为:

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

201301    5000
201302    13245

我怎样才能在熊猫身上做到这一点

我相信这就是你想要的:

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

有趣的是,通常
len(unique())
nunique()快几倍(3x-15x)
这里有另一种方法,非常简单,假设您的数据帧名称是
daat
,列名是
YEARMONTH

daat.YEARMONTH.value_counts()

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

我也在使用
nunique
,但如果您必须使用聚合函数,如
“min”、“max”、“count”或“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

有了新的pandas版本,很容易获得数据帧

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

这里提供了一种在多个列上具有不同计数的方法。让我们来看一些数据:

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
列的不同部分以及其他列上的聚合 要获得任何列的不同数值(
CLIENTCODE
,在您的情况下),我们可以使用
nunique
。我们可以在
agg
函数中将输入作为字典传递,并在其他列上进行聚合:

grp_df=df.groupby('YEARMONTH').agg({'CLIENTCODE':['nunique'],
'other_col_1':['sum','count']})
#展平多级柱的步骤
grp_df.columns=[“_.join(col).strip()表示grp_df.columns.values中的col]
#如果要重置索引
grp_df.重置索引(就地=真)

我已经完成了table.groupby(['YEARMONTH'])['CLIENTCODE'].unique(),并提供了按YEARMONTH索引的两个系列和所有唯一值。如何计算每个系列上的值的数量?对于一些人来说,
value\u counts
可能是你想要的答案:你是说这个
.CLIENTCODE.apply(lambda x:len(x.unique())
,从@user32185开始,您必须使用lambda将其放入
apply
调用中。例如,
df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x:x.unique().shape[0])
。语法不完全清楚,我使用了
len(df['column'].unique())
不需要lambda函数我得到了
TypeError:method类型的对象没有len()
来自
Chen的
注释,
3novak的
对我很有用。如果我有多个列,我希望它们在一起是唯一的,比如。drop_重复项(子集=['col1','col2')?如何访问这个唯一计数。由于没有列名,所以我在重采样的输出中使用了这种样式。df_watch_record.resample('M').user.nunique()统计每月观看电影的唯一用户数,并使用table.groupby('YEARMONTH').CLIENTCODE.nunique()对其进行排序。排序_值(升序=False)是否可以对多个列应用此值?现在在这个例子中,只选择了一列。我喜欢这个答案。如果我的列名中有“.”(例如“ck.Class”),如何使用此方法?Thanksdaat['ck.Class'].value_counts()这并没有解决所问的问题。这是计算每个组内观察值的数量,而不是每个组具有的特定列的唯一值。这是错误的答案;它没有反映问题的
不同的
要求!此外,它不包括
NaN
的计数!如何将其导出为两列
YEARMONTH
count
。我还可以按降序设置计数吗?