熊猫数(不同)相当于

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)

  • 如果我有多个要一起唯一的列,例如.drop_duplicates(subset = ['col1','col2'])怎么办? (2认同)
  • 如何访问此唯一计数.因为没有列名 (2认同)
  • 并使用 table.groupby('YEARMONTH').CLIENTCODE.nunique().sort_values(ascending=False) 对它们进行排序 (2认同)
  • 是否可以将其应用于多个列?现在在示例中,仅选择了一列。 (2认同)

Ent*_*ast 72

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

daat.YEARMONTH.value_counts()
Run Code Online (Sandbox Code Playgroud)

  • 这并没有解决问题. (19认同)
  • 这会计算每个组中观察的数量,而不是每个组具有的某个列的唯一值. (5认同)
  • daat ['ck.Class']。value_counts() (3认同)
  • 这是不正确的答案;它不能反映问题中的“ DISTINCT”要求!而且,它不包括“ NaN”的计数! (2认同)

Rom*_* Kh 41

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

  • 你是这个意思?`.CLIENTCODE.apply(lambda x:len(x.unique()))`,来自[here](http://stackoverflow.com/a/17926436/4015990) (9认同)
  • @ user32185你必须将它放入带有lambda的`apply`调用中.例如,`df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x:x.unique().shape [0])`. (6认同)
  • 语法不完全清楚,我使用了`len(df['column'].unique())` 不需要 lambda 函数 (3认同)

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)


WeN*_*Ben 5

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