我需要计算每个
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
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
或者正如乔恩·克莱门茨评论的那样:
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。
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
unique
或 drop_duplicates
,这两个函数之间的细微差别是 unique
返回 numpy.array
而 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
对于这个具体问题,由于您想计算相对于另一个变量的不同值,除了此处其他答案提供的
groupby
方法之外,您还可以先简单地删除重复项,然后执行 value_counts()
:
import pandas as pd
df.drop_duplicates().domain.value_counts()
# 'vk.com' 3
# 'twitter.com' 2
# 'facebook.com' 1
# 'google.com' 1
# Name: domain, dtype: int64
df.domain.value_counts()
>>> df.domain.value_counts()
vk.com 5
twitter.com 2
google.com 1
facebook.com 1
Name: domain, dtype: int64
如果我理解正确的话,你想要每个
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