[英]Count the frequency of unique values in every pandas column using 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.