Python 熊猫计数(不同)当量
我使用pandas作为db替代品,因为我有多个数据库(oracle、mssql等),并且我无法将命令序列转换为SQL等效项 我在数据框中加载了一个表,其中包含一些列: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
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
。我还可以按降序设置计数吗?