Подтвердить что ты не робот

Считайте уникальные значения с помощью 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
4b9b3361

Ответ 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