У меня есть фрейм данных, в котором перечислены коды пользователей.
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')
, но получил ошибку:
«уникальный» не является допустимым именем функции для преобразования (имя)
Вы почти сделали это, последним шагом было объединение исходного фрейма данных с сгруппированным:
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]