繁体   English   中英

如何根据组内值的差异过滤大熊猫中的groupby对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM