Підрахунок панди (виразний) еквівалент


289

Я використовую панди як замінник db, оскільки у мене є кілька баз даних (oracle, mssql тощо), і я не в змозі скласти послідовність команд до еквівалента SQL.

У мене таблиця завантажена в DataFrame з деякими стовпцями:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

У SQL підрахувати кількість різних клієнтів на рік було б:

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

І результат був би

201301    5000
201302    13245

Як я можу це зробити в пандах?


Я зробив table.groupby (['YEARMONTH']) ['CLIENTCODE']. Як порахувати кількість значень для кожної серії?
Адріано Альмейда

Для когось , value_countsможливо, відповідь, яку ви шукаєте: pandas.pydata.org/pandas-docs/stable/generated/…
sachinruk

Відповіді:


434

Я вважаю, що ви цього хочете:

table.groupby('YEARMONTH').CLIENTCODE.nunique()

Приклад:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

2
Що робити, якщо у мене є кілька стовпців, які я хочу бути унікальними разом, як у .drop_duplicates (subset = ['col1', 'col2'])?
ErnestScribbler

4
Як отримати доступ до цієї унікальної кількості. Як немає назви стовпця
Тарун Ханеджа

Дякую багато, я використав цей стиль на виході з повторної вибірки. df_watch_record.resample ('M'). user.nunique () підраховує кількість унікальних користувачів, які переглянули фільм на місяць.
Мехді Каземі

1
і сортуйте їх з table.groupby ("YEARMONTH"). CLIENTCODE.nunique (). sort_values ​​(ascending = False)
wllbll

Чи можливо отримати ідентифікатор групи після nunique? Спробуйте як би я не міг знайти спосіб, оскільки результат цієї відповіді - це Seriesне, а не DataFrame.
Джош Хансен

93

Ось ще один простий метод, який дозволяє сказати ім'я вашого фрейму даних daatі ім'я стовпцяYEARMONTH

daat.YEARMONTH.value_counts()

1
Мені подобається ця відповідь. Як я можу використовувати цей метод, якщо в моєму стовпчику є "." в ньому (наприклад, 'ck.Class')? Дякую

5
daat ['ck.Class']. value_counts ()
StatguyUser

28
Це не стосується поставленого питання.
Аарон Шумахер

6
це підрахунок кількості спостережень у кожній групі, а не унікальне значення певного стовпця, який має кожна група.
Гол Джейсона

2
Це неправильна відповідь; це не відображає DISTINCTвимоги з питання! Більше того, вона не включає рахунки NaN!
Корі Левінсон

47

Цікаво, що дуже часто len(unique())в кілька разів (3x-15x) швидше, ніж nunique().


11
Ти це маєш на увазі? .CLIENTCODE.apply(lambda x: len(x.unique())), звідси
user4015990

6
@ user32185 вам доведеться передати його на applyдзвінок лямбда. Так , наприклад, df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]).
3новак

3
Синтаксис не зовсім зрозумілий, я len(df['column'].unique())не використовував функції лямбда
mlh351

Я отримав TypeError: object of type 'method' has no len()від Chen'sкоментаря, 3novak'sпрацював на мене.
Гол Джейсона

4

Використовуючи crosstab, це поверне більше інформації, ніжgroupby nunique

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

Трохи модифікуючи, дайте результат

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

Як я можу експортувати це у два стовпці YEARMONTHта count. Чи можу я встановити кількість рахунків у порядку зменшення?
Муртаза Хаджі

3

Я також використовую, nuniqueале це буде дуже корисно, якщо вам доведеться використовувати сукупну функцію, як 'min', 'max', 'count' or 'mean'і т.д.

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

0

З новою версією панд легко отримати її як кадр даних

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

0

Тут підхід, щоб мати кілька чітких рахунків у кількох колонках. Давайте матимемо деякі дані:

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

Тепер перерахуйте цікаві стовпці та використовуйте groupby у дещо зміненому синтаксисі:

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

Ми отримуємо:

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

0

Розрізнення стовпця разом з агрегатами на інших стовпцях

Щоб отримати чітку кількість значень для будь-якого стовпця ( CLIENTCODEу вашому випадку), ми можемо використовувати nunique. Ми можемо передавати вхід як словник у aggфункції, а також агрегації в інших стовпцях:

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# if you wish to reset the index
grp_df.reset_index(inplace=True)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.