398 Stimmen

Pandas 'count(distinct)'-Äquivalent

Ich verwende Pandas als Ersatz für eine Datenbank, da ich mehrere Datenbanken (Oracle, SQL Server, etc.) habe und nicht in der Lage bin, eine Abfolge von Befehlen zu einem SQL-Äquivalent zu machen.

Ich habe eine Tabelle in einem DataFrame geladen mit einigen Spalten:

YEARMONTH, CLIENTCODE, SIZE, etc., etc.

In SQL würde es so aussehen, um die Anzahl der verschiedenen Kunden pro Jahr zu zählen:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

Und das Ergebnis wäre

201301    5000
201302    13245

Wie kann ich das in Pandas machen?

5voto

BENY Punkte 302708

Mit crosstab wird mehr Informationen zurückgegeben als mit groupby nunique:

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]:
CLIENTCODE  1  2  3
YEARMONTH
201301      2  1  0
201302      1  2  1

Nach einer kleinen Änderung ergibt sich das Ergebnis:

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]:
YEARMONTH
201301    2
201302    3
dtype: int64

4voto

Ramon Punkte 448

Hier ist ein Ansatz, um über mehrere Spalten hinweg eine distinct count zu haben. Lassen Sie uns einige Daten haben:

data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
        'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
        'PRODUCT_CODE': [100,150,220,400,50,80,100]
       }
table = pd.DataFrame(data)
table

CLIENT_CODE YEAR_MONTH  PRODUCT_CODE
0   1       201301      100
1   1       201301      150
2   2       201301      220
3   1       201302      400
4   2       201302      50
5   2       201302      80
6   3       201302      100

Jetzt, listen Sie die Interessensspalten auf und verwenden Sie groupby in einer leicht modifizierten Syntax:

columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()

Wir erhalten:

YEAR_MONTH  PRODUCT_CODE CLIENT_CODE
1           2            3
2           2            3
3           1            1

1voto

Wickkiey Punkte 3973

Mit der neuen Pandas-Version ist es einfach, als Datenrahmen zu erhalten:

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE=('CLIENTCODE', pd.Series.count))

1voto

Panwen Wang Punkte 3078

Jetzt können Sie auch die dplyr-Syntax in Python verwenden, um es zu tun:

>>> from datar.all import f, tibble, group_by, summarise, n_distinct
>>>
>>> data = tibble(
...     CLIENT_CODE=[1,1,2,1,2,2,3],
...     YEAR_MONTH=[201301,201301,201301,201302,201302,201302,201302]
... )
>>>
>>> data >> group_by(f.YEAR_MONTH) >> summarise(n=n_distinct(f.CLIENT_CODE))
   YEAR_MONTH       n

0      201301       2
1      201302       3

1voto

Golden Lion Punkte 2590

Erstellen Sie eine Pivot-Tabelle und verwenden Sie die nunique Serienfunktion:

ID = [ 123, 123, 123, 456, 456, 456, 456, 789, 789]
domain = ['vk.com', 'vk.com', 'twitter.com', 'vk.com', 'facebook.com',
          'vk.com', 'google.com', 'twitter.com', 'vk.com']
df = pd.DataFrame({'id':ID, 'domain':domain})
fp = pd.pivot_table(data=df, index='domain', aggfunc=pd.Series.nunique)
print(fp)

Ausgabe:

               id
domain
facebook.com   1
google.com     1
twitter.com    2
vk.com         3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X