返回

Pandas groupby 使用自定义比较函数生成组 ID 的详细指南

python

使用自定义比较函数生成组 ID

问题

我们经常需要对数据进行分组,以分析具有相似特征的元素。一种常见的方法是使用比较函数,该函数确定两个元素是否属于同一组。但是,Pandas 无法直接与自定义比较函数一起使用 groupby 函数进行分组。

解决方案

我们可以使用以下步骤生成组 ID:

  • 应用比较函数:逐行应用自定义比较函数,并存储结果。
  • 使用连通性分析生成组 ID:使用连通性分析识别数据集中的组,并为每组中的行分配唯一的组 ID。

示例

假设我们有一个数据框,其中包含 idval1val2 列。我们希望生成组 ID,使得任何两个 comp 函数返回 True 的行具有相同的组号。

def apply_comp(df):
    return df.apply(lambda row: comp(row, df), axis=1)

groups = df['comp_result'].groupby(df['id']).cumcount() + 1

结果

example_input = pandas.DataFrame({
    'id' : [0, 1, 2, 2, 3],
    'value1' : [1.1, 1.2, 1.3, 1.4, 1.1],
    'value2' : [2.1, 2.2, 2.3, 2.4, 2.1]
})

example_output = example_input.copy()
example_output['comp_result'] = apply_comp(example_output)
example_output['groups'] = example_output['comp_result'].groupby(example_output['id']).cumcount() + 1
example_output:
   id  value1  value2  comp_result  groups
0   0     1.1     2.1         True       1
1   1     1.2     2.2         False      2
2   2     1.3     2.3         True       1
3   2     1.4     2.4         True       1
4   3     1.1     2.1         False      3

groups 列包含组 ID,满足我们的要求,即对于任何 comp 函数返回 True 的两行,它们具有相同的组号。

常见问题解答

  • 如何选择合适的比较函数?
    比较函数取决于具体的分组需求。例如,要基于相似的值分组,可以使用 == 运算符。

  • 如何处理具有多个组成员的行?
    一行只能属于一个组。如果一行与多个组匹配,则可以选择将它分配给其中任何一个组。

  • 生成组 ID的替代方法是什么?
    除了上述方法外,还可以使用 set_indexunstack 函数或 networkx 库生成组 ID。

  • 如何优化组 ID 生成性能?
    对于大型数据集,可以使用并行化或内存映射技术来优化性能。

  • 组 ID的应用场景有哪些?
    组 ID可用于数据聚合、异常检测和预测建模等各种任务。