Pandas добавляет уникальные значения из Groupby в столбец

У меня есть фрейм данных, в котором перечислены коды пользователей.

UserID     Code
   123        A
   123        B
   123        A
   456        C
   456        D

Как добавить столбец, в котором показаны уникальные коды всех пользователей?

UserID     Code     UniqueCodes
   123        A          [A, B]
   123        B          [A, B]
   123        A          [A, B]
   456        C          [C, D]
   456        D          [C, D]

Я попробовал сделать df.groupby(by='UserID')['Code'].agg(['unique']), но это не сработало.

Я тоже пытался сделать df.groupby(by='UserID')['Code'].transform('unique'), но получил ошибку:

«уникальный» не является допустимым именем функции для преобразования (имя)

🤔 А знаете ли вы, что...
Python поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование.


50
3

Ответы:

Решено

Вы почти сделали это, последним шагом было объединение исходного фрейма данных с сгруппированным:

df.merge(df.groupby(by='UserID')['Code'].agg(['unique']).reset_index(), on = 'UserID')


UserID  Code    unique
0   123 A   [A, B]
1   123 B   [A, B]
2   123 A   [A, B]
3   456 C   [C, D]
4   456 D   [C, D]

Вы можете использовать df.groupby и groupby.unique и карту в столбце «UserID»:

df['UniqueCodes'] = df['UserID'].map(df.groupby('UserID')['Code'].unique())

Выход:

   UserID Code UniqueCodes
0     123    A      [A, B]
1     123    B      [A, B]
2     123    A      [A, B]
3     456    C      [C, D]
4     456    D      [C, D]

Другое возможное решение, использующее преобразование , создающее список с уникальными кодами. Этот список должен быть повторен столько раз, сколько длина группы.

df['UniqueCodes'] = df.groupby(
    'UserID')['Code'].transform(lambda x: [x.unique().tolist()] * len(x))

Выход:

   UserID Code UniqueCodes
0     123    A      [A, B]
1     123    B      [A, B]
2     123    A      [A, B]
3     456    C      [C, D]
4     456    D      [C, D]