如何在数据集中找到多个最小值中的第一个?我最终希望依次找到比最小值至少大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
正如评论中所建议的那样,循环将是解决此问题的更好方法。
答案 0 :(得分:1)
好像您需要cummin
和一个简单的loc
df['cummin_'] = df.groupby('ID').value.cummin()
df['condition'] = df.value >= df.cummin_ + 2
ID value cummin_ condition
0 1 0.6 0.6 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
另一种选择是使用expanding
。以
df = pd.DataFrame({'ID': [1,1,1,1,1,1,1,2,2], 'value': [0.6, 1.5, 1.6, 1.2, 2.8, 0.3, 0.2,0.4,2.9]})
然后
df.groupby('ID').value.expanding(2).min()
ID
1 0 NaN
1 0.6
2 0.6
3 0.6
4 0.6
5 0.3
6 0.2
2 7 NaN
8 0.4
扩展功能首先产生NaN
,而cummin
占第一个值。只需了解您希望如何解释结果即可。