簡體   English   中英

使用 pandas groupby 計算唯一值

[英]Count unique values using pandas groupby

我有以下形式的數據:

 df = pd.DataFrame({ 'group': [1, 1, 2, 3, 3, 3, 4], 'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan] }) print(df) # group param # 0 1 a # 1 1 a # 2 2 b # 3 3 NaN # 4 3 a # 5 3 a # 6 4 NaN

組內的非空值始終相同。 我想為每個組(它存在的地方)計算一次非空值,然后找到每個值的總計數。

我目前正在以以下(笨拙且低效)的方式執行此操作:

 param = [] for _, group in df[df.param.notnull()].groupby('group'): param.append(group.param.unique()[0]) print(pd.DataFrame({'param': param}).param.value_counts()) # a 2 # b 1

我確信有一種方法可以更干凈地做到這一點並且不使用循環,但我似乎無法解決它。 任何幫助將非常感激。

我認為您可以使用SeriesGroupBy.nunique

 print (df.groupby('param')['group'].nunique()) param a 2 b 1 Name: group, dtype: int64

另一個具有unique解決方案,然后通過DataFrame.from_records創建新的df ,通過stack和最后一個value_counts重塑為Series

 a = df[df.param.notnull()].groupby('group')['param'].unique() print (pd.DataFrame.from_records(a.values.tolist()).stack().value_counts()) a 2 b 1 dtype: int64

這只是解決方案的一個附加組件,以防您不僅要計算唯一值,還要計算其他聚合函數:

 df.groupby(['group']).agg(['min', 'max', 'count', 'nunique'])

上面的答案也有效,但如果您想將具有 unique_counts 的列添加到現有數據框,您可以使用transform

 df['distinct_count'] = df.groupby(['param'])['group'].transform('nunique')

output:

 group param distinct_count 0 1 a 2.0 1 1 a 2.0 2 2 b 1.0 3 3 NaN NaN 4 3 a 2.0 5 3 a 2.0 6 4 NaN NaN

並檢查@jezrael 的組數。

 print (df.groupby('param')['group'].nunique())
 param a 2 b 1 Name: group, dtype: int64

我知道這篇文章發布已經有一段時間了,但我認為這也會有所幫助。 我想計算唯一值並按這些唯一值的數量過濾組,我就是這樣做的:

 df.groupby('group').agg(['min','max','count','nunique']).reset_index(drop=False)

這種方式更快更方便:

 df.groupby('param').agg({'group':lambda x: len(pd.unique(x))})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM