首页 > 解决方案 > DataError:没有数字类型可以聚合尝试对字母数字值进行排名

问题描述

我在一个较大的数据框中有两列,它们代表我的数据库中记录的 ID 和不必唯一的 PII 数据哈希。我想要实现的是一个类似窗口的函数,它根据 ID 升序排列每个 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")

标签: pythonpandasdataframe

解决方案


让我们尝试使用以下方法groupby进行sha256_cpn转换:idSeries.factorize

df['rank'] = df.groupby('sha256_cpn')['id']\
               .transform(lambda s: s.factorize(sort=True)[0] + 1)

sort_valuesthen 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

推荐阅读