我有一个由子句创建的熊猫数据框: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] 删除。
我来说两句