【问题标题】:Pandas groupby values with tiny differencePandas groupby 值差异很小
【发布时间】:2026-01-15 05:15:01
【问题描述】:

我有一个由子句创建的熊猫数据框: df = pd.DataFrame({'A':[29,31,48,51,66,64,68], 'B':[1.2,1.7,1.1,0.9,1.3,1.2,1.5]}) 它看起来像这样:

    A    B
0  29  1.2
1  31  1.7
2  48  1.1
3  51  0.9
4  66  1.3
5  64  1.2
6  68  1.5

我想按“A”分组,不是用精确值,而是用绝对值小于 5。所以我想要的是这样的:

    A    B  GroupId
0  29  1.2        1
1  31  1.7        1
2  48  1.1        2
3  51  0.9        2
4  66  1.3        3
5  64  1.2        3
6  68  1.5        3

我该怎么办?

我发现group by a dataframe by values that are just less than a second off - pandas 很有帮助,所以我可以使用: df['sum'] = [df.loc[(df['A'] - t).abs() < 5, 'B'].sum() for t in df['A']] 流动:

    A    B  sum
0  29  1.2  2.9
1  31  1.7  2.9
2  48  1.1  2.0
3  51  0.9  2.0
4  66  1.3  4.0
5  64  1.2  4.0
6  68  1.5  4.0

然后我可以使用 'sum' 作为 ID 将此数据帧分成不同的组。 有没有更好的办法?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    因为A 列的值按Series.diff 排序得到差异,所以比较更大的Series.gt 并添加Series.cumsum 的累积总和:

    #if necessary
    df = df.sort_values('A')
    
    df['GroupId'] = df.A.diff().gt(5).cumsum() + 1
    print (df)
        A    B  GroupId
    0  29  1.2        1
    1  31  1.7        1
    2  48  1.1        2
    3  51  0.9        2
    4  66  1.3        3
    5  64  1.2        3
    6  68  1.5        3
    

    如果可能,一些负值和绝对值是必要的处理:

    df = pd.DataFrame({'A':[-29,31,-48,51,66,64,68], 'B':[1.2,1.7,1.1,0.9,1.3,1.2,1.5]})
    
    df = df.assign(A1= df.A.abs()).sort_values('A1')
    df['GroupId'] = df.A1.diff().gt(5).cumsum() + 1
    print (df)
        A    B  A1  GroupId
    0 -29  1.2  29        1
    1  31  1.7  31        1
    2 -48  1.1  48        2
    3  51  0.9  51        2
    5  64  1.2  64        3
    4  66  1.3  66        3
    6  68  1.5  68        3
    

    【讨论】: