Ошибка DataError: нет числовых типов для агрегирования Попытка ранжирования буквенно-цифрового значения

#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 Счастливого кодирования!