[英]Filter Values in Python of a Pandas Dataframe
我有一个数据集,一旦超过某个值,我就需要对其进行过滤,但不能超过。 这是数据框的示例:
Dip MD
0 70 5000
1 80 6000
2 90 7000
3 80 8000
我想在 Dip 第一次超过 85 之前过滤掉所有内容,因此结果数组应如下所示:
Dip MD
0 90 7000
1 80 8000
也许使用cummax
In [71]: df = pd.DataFrame({'Dip': [70, 80, 90, 80],
...: 'MD': [5000, 6000, 7000, 8000]})
In [72]: df[df.Dip.gt(85).cummax()]
Out[72]:
Dip MD
2 90 7000
3 80 8000
您可以先找到满足条件的第一个值的位置索引:
idx = next(iter(np.where(df['Dip'] > 85)[0]), df.shape[0])
然后从此值开始按整数位置对数据帧进行切片:
res = df.iloc[idx:]
如果您的条件从不满足,则选择df.shape[0]
作为默认值可确保在这种情况下返回整个数据帧。
性能说明
对于较大的数据集,您可能会发现整数索引比布尔索引更有效:
np.random.seed(0)
df = pd.DataFrame({'A': np.random.randint(0, 100, 10**6)})
%timeit df[df['A'].gt(90).cummax()] # 36.1 ms
%timeit df.iloc[next(iter(np.where(df['A'] > 90)[0]), df.shape[0]):] # 4.04 ms
如果效率是主要问题,请参阅有效返回数组中满足条件的第一个值的索引。 这个想法是如果条件更早满足,您不必遍历整个系列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.