【问题标题】:how to filter groupby object in pandas based on difference of values within the group?如何根据组内值的差异过滤熊猫中的 groupby 对象?
【发布时间】:2014-03-25 19:35:04
【问题描述】:

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

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

然后,10 的阈值 C 将产生一个像这样的决赛桌:

   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 以内。

【问题讨论】:

  • 但是 62 - 46 > 10 那么为什么 b 中的某些行没有被丢弃?
  • 但 62 与 b 56 中的另一个值相差 10 以内。
  • 那么如果你有 3、4、23、24 个,你会保留它们吗?
  • 是的,这是正确的。

标签: python python-2.7 pandas


【解决方案1】:

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

【讨论】:

  • 嗯......这很有趣......谢谢@Andy。仍然需要一些时间来将 numpy 部分包含在我的脑海中,但效果很好。
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2018-12-09
  • 2017-05-18
  • 2017-12-30
  • 2014-02-25
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多