Python 3.x — nunique не работает с groupby

#group-by #unique

#группировка по #уникальный

Вопрос:

Мне нужно вычислить количество уникальных пользователей из df. Я использую функцию groupby —

 df - 
col1 col2 col3 col4
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9

Unique_df = df.groupby(['col1','col2','col3'],as_index=False)['col4'].nunique()
  

Ожидаемый результат

 Unique_df -
col1 col2 col3 col4
a    p    x    2 
b    q    y    1
b    r    y    1
c    s    z    1
c    t    z    1
  

К сожалению, я получаю следующую ошибку —
Ошибка атрибута: объект ‘DataFrameGroupBy’ не имеет атрибута ‘nunique’

Как я могу получить ожидаемый результат?

РЕДАКТИРОВАТЬ — я пытался —

 df.groupby(['col1','col2','col3'],as_index=False)['col4'].apply(lambda x: len(x.unique()))
  

Но, к сожалению, это дает мне ряд —

 col1 col2 col3 
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9
  

Я этого не хочу. Мне нужен фрейм данных, как я упоминал в «Ожидаемом выходе»

Я попытался преобразовать эту серию в dataframe, используя — pd.DataFrame(df)

Но это дает —

                col4
col1 col2 col3 
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9
  

Опять же, это отличается от «ожидаемого результата»

Ответ №1:

Согласно документации для pandas, возвращаемое значение для функции nunique должно быть только серией.

https://pandas.pydata.org/pandas-docs/stable/generated/pandas .DataFrame.nunique.html

Я протестировал ваш код. Единственный раз, когда я получил вывод в виде фрейма данных, это когда я сделал, как показано ниже. Где я упомянул параметр as_index и удалил вычисление длины для значений nunique.

 >>> var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:x.nunique())
>>> type(var1)
<class 'pandas.core.frame.DataFrame'>

>>> var2 = var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:len(x.nunique()))
>>> type(var2)
<class 'pandas.core.series.Series'>
  

Похоже, что когда я пытаюсь использовать as_index=False и функцию Len(), значение становится серией вместо фрейма данных. Не уверен, решает ли это проблему. Но я надеюсь, что это поможет вам попробовать разные варианты. Я предлагаю помещать различные комбинации в переменные и проверять их тип и поведение при их изменении.

 >>> var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:x.nunique())
>>> var1
                     col1  col2  col3  col4
col1 col2 col3 col4                        
a    p    x    2        1     1     1     1
b    q    y    1        1     1     1     1
     r    y    1        1     1     1     1
c    s    z    1        1     1     1     1
     t    z    1        1     1     1     1

>>> type(var1)
<class 'pandas.core.series.Series'>
  

Ответ №2:

Я столкнулся с той же проблемой несколько дней назад. Я использовал group.nunique(), который работал на моем компьютере, но не работал на другом.

Я решил эту проблему, обновив anaconda (conda update —all). Я подозреваю (но не верьте мне на слово), что это вызвано устаревшей библиотекой numpy (conda update numpy)…

Я надеюсь, что это поможет!