繁体   English   中英

在 Pandas 数据帧的 Python 中过滤值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM