我有一个带有值列表的数据框:
In [24]: data
Out[24]:
[{'value': 1.2},
{'value': 2.2},
{'value': 1.8},
{'value': 2.0},
{'value': 1.1},
{'value': 3.9},
{'value': 0.0},
{'value': 1.5},
{'value': 2.5},
{'value': 1.6},
{'value': 2.3},
{'value': 3.0},
{'value': 3.3},
{'value': 0.5},
{'value': 4.0},
{'value': 3.4},
{'value': 0.8},
{'value': 2.5},
{'value': 2.1},
{'value': 3.0}]
In [25]: df = pd.DataFrame(data=data)
In [26]: df
Out[26]:
value
0 1.2
1 2.2
2 1.8
3 2.0
4 1.1
5 3.9
6 0.0
7 1.5
8 2.5
9 1.6
10 2.3
11 3.0
12 3.3
13 0.5
14 4.0
15 3.4
16 0.8
17 2.5
18 2.1
19 3.0
现在,我要通过以下方式选择此数据框的子集:
df['value'].max()
即-最大值是4.0,所以我想找到值最接近的行4.0 - 0.2 = 3.8
,即第5行。接下来,我想找到具有value的行4.0 - (0.2 * 2) = 3.6
,所以这将是第15行(带有3.4),依此类推(向上)至N次)
有没有一种快速的方法可以做到这一点?
预期输出:
value
0 4.0
1 3.9
2 3.4
我将使用的实际数据应更均匀地分布,因此在每个预期值(即3.8、3.6、3.4左右)附近会有许多接近值(例如3.44、3.38、3.41)
假设分辨率(0.2
)预期比最接近的距离大很多,我相信您可以使用merge_asof
:
step, N = 0.2, 3
maxval = df['value'].max()
(pd.merge_asof(df.sort_values('value'),
pd.DataFrame({'ref':maxval-np.arange(N)*step}).sort_values('ref'),
left_on='value',
right_on='ref',
direction='nearest')
.assign(dist=lambda x: x['ref'].sub(x['value']).abs())
.sort_values('dist')
.drop_duplicates('ref')
)
输出:
value ref dist
19 4.0 4.0 0.0
18 3.9 3.8 0.1
17 3.4 3.6 0.2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句