Считайте уникальные значения с помощью pandas
Мне нужно подсчитать уникальные значения 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
Ответы
Ответ 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
Или как Jon Clements
прокомментировал:
df.groupby(df.domain.str.strip("'"))['ID'].nunique()
Ответ 2
Обычно для подсчета различных значений в одном столбце вы можете использовать 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
возвращает a numpy.array
, а drop_duplicates
возвращает a 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
Ответ 3
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