使用每组的pandas计算唯一值

时间:2016-07-11 14:38:25

标签: python pandas group-by unique pandas-groupby

我需要计算每个ID中唯一的domain值 我有数据

ID, domain
123, 'vk.com'
123, 'vk.com'
123, 'twitter.com'
456, 'vk.com'
456, 'facebook.com'
456, 'vk.com'
456, 'google.com'
789, 'twitter.com'
789, 'vk.com'

我尝试df.groupby(['domain', 'ID']).count() 但我想得到

domain, count
vk.com   3
twitter.com   2
facebook.com   1
google.com   1

4 个答案:

答案 0 :(得分:144)

通常,要计算单列中的不同值,您可以使用Series.value_counts

df.domain.value_counts()

#'vk.com'          5
#'twitter.com'     2
#'facebook.com'    1
#'google.com'      1
#Name: domain, dtype: int64

要查看列中有多少唯一值,请使用Series.nunique

df.domain.nunique()
# 4

要获取所有这些不同的值,您可以使用uniquedrop_duplicates,这两个函数之间的细微差别是unique返回numpy.array而{{1} }}返回drop_duplicates

pandas.Series

至于这个特定的问题,既然你想要计算另一个变量的不同值,除了这里的其他答案提供的df.domain.unique() # array(["'vk.com'", "'twitter.com'", "'facebook.com'", "'google.com'"], dtype=object) df.domain.drop_duplicates() #0 'vk.com' #2 'twitter.com' #4 'facebook.com' #6 'google.com' #Name: domain, dtype: object 方法,你也可以先删除重复,然后再做{ {1}}:

groupby

答案 1 :(得分:143)

您需要nunique

df = df.groupby('domain')['ID'].nunique()

print (df)
domain
'facebook.com'    1
'google.com'      1
'twitter.com'     2
'vk.com'          3
Name: ID, dtype: int64

如果您需要strip '个字符:

df = df.ID.groupby([df.domain.str.strip("'")]).nunique()
print (df)
domain
facebook.com    1
google.com      1
twitter.com     2
vk.com          3
Name: ID, dtype: int64

Jon Clements注释:

df.groupby(df.domain.str.strip("'"))['ID'].nunique()

您可以保留列名,如下所示:

df = df.groupby(by='domain', as_index=False).agg({'ID': pd.Series.nunique})
print(df)
    domain  ID
0       fb   1
1      ggl   1
2  twitter   2
3       vk   3

区别在于nunique()会返回一个系列,agg()会返回一个DataFrame。

答案 2 :(得分:21)

df.domain.value_counts()

>>> df.domain.value_counts()

vk.com          5

twitter.com     2

google.com      1

facebook.com    1

Name: domain, dtype: int64

答案 3 :(得分:10)

IIUC您想要每ID个不同domain的数量,那么您可以试试这个:

output = df.drop_duplicates()
output.groupby('domain').size()

输出:

    domain
facebook.com    1
google.com      1
twitter.com     2
vk.com          3
dtype: int64

您也可以使用效率稍低的value_counts。但最好的是Jezrael使用nunique的回答:

%timeit df.drop_duplicates().groupby('domain').size()
1000 loops, best of 3: 939 µs per loop
%timeit df.drop_duplicates().domain.value_counts()
1000 loops, best of 3: 1.1 ms per loop
%timeit df.groupby('domain')['ID'].nunique()
1000 loops, best of 3: 440 µs per loop