熊猫groupby值相差无几

杰瑞

我有一个由子句创建的熊猫数据框: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'进行分组,而不是精确的值,但abs小于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

我能怎么做?

我发现数据框按小于一秒的值分组-熊猫很有帮助,所以我可以使用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将此数据帧分为不同的组。有什么更好的办法吗?

耶斯列尔

由于对列的值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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章