it-swarm.com.de

Zählen Sie eindeutige Werte mit pandas pro Gruppe

Ich muss eindeutige ID Werte in jedem domain zählen, über das ich Daten verfüge

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'

Ich versuche df.groupby(['domain', 'ID']).count() Aber ich will bekommen

domain, count
vk.com   3
Twitter.com   2
facebook.com   1
google.com   1
131

Sie benötigen 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

Wenn Sie strip' Zeichen benötigen:

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

Oder als Jon Clements kommentiert:

df.groupby(df.domain.str.strip("'"))['ID'].nunique()

Sie können den Spaltennamen wie folgt beibehalten:

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

Der Unterschied besteht darin, dass nunique() eine Serie und agg() einen DataFrame zurückgibt.

173
jezrael

Im Allgemeinen können Sie zum Zählen einzelner Werte in einer Spalte Series.value_counts verwenden:

_df.domain.value_counts()

#'vk.com'          5
#'Twitter.com'     2
#'facebook.com'    1
#'google.com'      1
#Name: domain, dtype: int64
_

Verwenden Sie Series.nunique , um zu sehen, wie viele eindeutige Werte in einer Spalte vorhanden sind:

_df.domain.nunique()
# 4
_

Um all diese unterschiedlichen Werte zu erhalten, können Sie unique oder drop_duplicates verwenden. Der geringfügige Unterschied zwischen den beiden Funktionen besteht darin, dass unique ein _numpy.array_ zurückgibt _drop_duplicates_ gibt einen _pandas.Series_ zurück:

_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
_

Da Sie für dieses spezielle Problem einen bestimmten Wert in Bezug auf eine andere Variable zählen möchten, können Sie neben der Methode groupby, die hier durch andere Antworten bereitgestellt wird, auch einfach Duplikate löschen und dann value_counts() ausführen:

_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
_
170
Psidom

df.domain.value_counts ()

>>> df.domain.value_counts()

vk.com          5

Twitter.com     2

google.com      1

facebook.com    1

Name: domain, dtype: int64
25
kamran kausar

IIUC Sie möchten die Anzahl der verschiedenen ID für jeden domain, dann können Sie dies versuchen:

output = df.drop_duplicates()
output.groupby('domain').size()

ausgabe:

    domain
facebook.com    1
google.com      1
Twitter.com     2
vk.com          3
dtype: int64

Sie könnten auch value_counts verwenden, was etwas weniger effizient ist. Das Beste ist jedoch, dass Jezrael mit nunique antwortet:

%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
10
ysearka