Подсчет уникальных значений с панд на группы [дубликат]
этот вопрос уже есть ответ здесь:
мне нужно посчитать уникальные 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 ответов:
вам нужно
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()возвращает фрейм данных.
обычно для подсчета различных значений в одном столбце можно использовать
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возвращает apandas.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
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, что немного менее эффективно.Но лучше всего ответ Израила с помощью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
df.домен.value_counts ()
>>> df.domain.value_counts() vk.com 5 twitter.com 2 google.com 1 facebook.com 1 Name: domain, dtype: int64
Comments