#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)…
Я надеюсь, что это поможет!