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

时间:2014-03-25 19:35:04

标签: python python-2.7 pandas

我有一个如下所列的数据框:

In []: dff = pd.DataFrame({'A': np.arange(8),
                           'B': list('aabbbbcc'),
                           'C':np.random.randint(100,size=8)})

我根据列B

进行了分组
  In []: grouped = dff.groupby('B')

现在,我想根据dff列中值的差异来过滤'C'。例如,如果列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

然后,10的{​​{1}}阈值将生成如下的最终表:

C

这里分组的类别c(小写字母)被删除,因为两者之间的差异大于10,但是类别b的所有行都完整无缺,因为它们都在10之内。

1 个答案:

答案 0 :(得分:0)

我想我会在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