#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть два столбца в большем фрейме данных, которые представляют идентификатор записи в моей базе данных и хэш данных PII, которые не обязательно должны быть уникальными. Чего я пытаюсь достичь, так это оконной функции, которая ранжирует каждый хэш PII на основе идентификатора в порядке возрастания (см. Пример ниже). Однако я столкнулся с проблемой с groupby().rank()
цепочкой методов, потому что эти значения являются строками. Есть ли какое-то преобразование, которое мне нужно было бы сделать для достижения этой цели?
id | sha256_cpn | rank
2bce | 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb | 2
1bce | 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb | 1
3bce | 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb | 3
Вот ошибка:
DataError: No numeric types to aggregate
Вот мой код:
// id = object
// sha256_cpn = object
df['rank'] = df.sort_values(['sha256_cpn', 'id']).groupby('sha256_cpn')['id'].rank(method="first")
Комментарии:
1. являются ли значения
ids
для конкретногоsha256_cpn
уникальными?2. Да, это правильно. Идентификаторы уникальны, sha256_cpn не являются уникальными
Ответ №1:
Давайте попробуем groupby
sha256_cpn
и преобразуем id
с помощью Series.factorize
:
df['rank'] = df.groupby('sha256_cpn')['id']
.transform(lambda s: s.factorize(sort=True)[0] 1)
Другой подход с sort_values
then groupby
cumcount
:
df['rank'] = df.sort_values(['sha256_cpn', 'id'])
.groupby('sha256_cpn').cumcount().add(1)
id sha256_cpn rank
0 2bce 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb 2
1 1bce 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb 1
2 3bce 1005a9eaf26b44bfd70b6430f1e86fd14add9b042d4383b6f6fcb6549e5360cb 3
Комментарии:
1. Это здорово. Достигается именно то, что я искал. Спасибо!
2. @cphill Счастливого кодирования!