![](/img/trans.png)
[英]How to built in if-condition based on group size in a pandas groupby object
[英]how to filter groupby object in pandas based on difference of values within the group?
我有一个数据框,如下所示:
In []: dff = pd.DataFrame({'A': np.arange(8),
'B': list('aabbbbcc'),
'C':np.random.randint(100,size=8)})
我根据B
列进行了分组
In []: grouped = dff.groupby('B')
现在,我想基于'C'
列中值的差异来过滤dff
。 例如,如果列C
组中任意两个点之间的差大于阈值,则删除该行。
如果dff
是:
A B C
0 0 a 18
1 1 a 25
2 2 b 56
3 3 b 62
4 4 b 46
5 5 b 56
6 6 c 74
7 7 c 3
然后, C
的阈值10
将产生一个最终表,如下所示:
A B C
0 0 a 18
1 1 a 25
2 2 b 56
3 3 b 62
4 4 b 46
5 5 b 56
此处,由于分组的类别c(小写字母)之间的差异大于10,因此将其删除,但是类别b的所有行都完整无缺,因为它们之间的距离都在10之内。
我想我会在numpy中努力工作:
In [11]: a = np.array([2, 3, 14, 15, 54])
In [12]: res = np.abs(a[:, np.newaxis] - a) < 10 # Note: perhaps you want <= 10.
In [13]: np.fill_diagonal(res, False)
In [14]: res.any(0)
Out[14]: array([ True, True, True, True, False], dtype=bool)
您可以将其包装在一个函数中:
In [15]: def has_close(a, n=10):
res = np.abs(a[:, np.newaxis] - a) < n
np.fill_diagonal(res, False)
return res.any(0)
In [16]: g = df.groupby('B', as_index=False)
In [17]: g.C.apply(lambda x: x[has_close(x.C.values)])
Out[17]:
A B C
0 0 a 18
1 1 a 25
2 2 b 56
3 3 b 62
5 5 b 56
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.