【发布时间】:2019-01-26 02:29:40
【问题描述】:
如何在数据集中找到几个最小值中的第一个?我希望最终依次找到至少比最小值大 2 的值。
例如,
import pandas as pd
import numpy as np
df = pd.DataFrame({'ID': [1,1,1,1,1,1,1], 'value': [0.6, 1.5, 1.6, 1.2, 2.8, 0.3, 0.2]})
我想将 df['value'][0] 或简称为 (0.6) 标识为该数组中的第一个最小值。然后将 df['value'][4] 或 (2.8) 确定为比第一个确定的最小值 (0.6) 至少大 2 的值。
df = pd.DataFrame({'ID': [1,1,1,1,1,1,1], 'value': [0.6, 1.5, 1.6, 1.2, 2.8, 0.3, 0.2]})
df['loc_min'] = df.value[(df.value.shift(1) >= df.value) & (df.value.shift(-1) >= df.value)]
df['loc_min']= df.groupby(['ID'], sort=False)['loc_min'].apply(lambda x: x.ffill())
df['condition'] = (df['value'] >= df['loc_min'] + 2)
这适用于其他数据集,但不适用于最小值。
理想的输出是:
ID value loc_min condition
0 1 0.6 nan False
1 1 1.5 0.6 False
2 1 1.6 0.6 False
3 1 1.2 0.6 False
4 1 2.8 0.6 True
5 1 0.3 0.3 False
6 1 0.2 0.2 False
正如评论中所建议的,循环将是解决此问题的更好方法。
【问题讨论】:
-
您是在问如何在一维数组中找到局部最小值吗?如果是这样,您正在寻找this question(或从那里链接的其他人之一)的答案之一吗?
-
请添加您的预期输出以明确您想要什么。
-
我应该指出,一般来说,在 Numpy 中,您通常不会找到“第一个……”,而是找到“所有……”(可能永远并行),然后只需使用第一个或矢量化(或有时迭代)所有这些。因此,如果第一个短路对正确性很重要,或者预计会比矢量化带来更多的性能提升,那么您可能需要循环。
-
你能解释一下为什么第一个值是 NaN 吗?另外,如果数组是 [1.5, 0.6, ...] 怎么办?哪里 0.6 是第二个元素?
-
@abarnert 谢谢你的意见,我已经相应地更新了我的问题。不幸的是,工作数据不是一维数组,而是一个大型数据集。