我有一个如下所列的数据框:
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之内。
答案 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