我需要计算每个domain
中唯一的ID
值。
我有数据:
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
发布于 2016-07-11 22:43:54
您需要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()
返回一个Series,而agg()
返回一个DataFrame。
发布于 2018-04-05 03:02:15
df.domain.value_counts()
>>> df.domain.value_counts()
vk.com 5
twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64
发布于 2016-07-11 22:44:10
如果我理解正确的话,您需要为每个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
,它的效率稍低一些。但最好的是使用nunique
的Jezrael's answer
%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
https://stackoverflow.com/questions/38309729
复制相似问题