繁体   English   中英

如果值不在同一列上的两个其他值之间,则删除 pandas 行

[英]Drop pandas rows if value is not between two other values on the same column

我有以下 dataframe:

>>>      mes1       mes2      mes3     mes4     mes5
A1      0.45        0.21      0.53     0.33     0.11
A2      0.44        0.32      0.11     0.38     0.91
A3      0.78        0.31      0.53     0.32     0.14
A4      0.12        0.33      0.56     0.43     0.12
posUp   0.52        0.40      0.62     0.48     0.54
posDown 0.32        0.15      0.45     0.24     0.05

我想归档我的 dataframe,所以我将只留下它们的值在所有列的“posUp”和“posDown”值之间的,所以结果应该是:

>>>      mes1       mes2      mes3     mes4     mes5
A1      0.45        0.21      0.53     0.33     0.11
posUp   0.52        0.40      0.62     0.48     0.54
posDown 0.32        0.15      0.45     0.24     0.05

我试图通过将 dataframe 切成系列然后放置这样的条件来做到这一点:

for i in df:
    db=df[i]
    vmin=db.loc['posUp']
    vmax=db.loc['posDown']
    db=db[(db>vmin)&(db<vmax)]

然后我想删除在最后一个 db 过滤器中找不到的行,但它没有过滤任何东西,当我打印 db 时,我得到了 "Series([],Name: ..." 除此之外,我相信有比 for 循环更方便/有效的方法。

所以我的最终目标是只有在所有列中的行,它们的值在 posUp 和 posDown 之间。

您可以在sub之后尝试all操作。 PS:A3 不应该包括在内,因为 mes1 是 0.78

out = df[(df.sub(df.loc['posUp']).le(0) & df.sub(df.loc['posDown']).ge(0)).all(1)]
Out[107]: 
         mes1  mes2  mes3  mes4  mes5
A1       0.45  0.21  0.53  0.33  0.11
posUp    0.52  0.40  0.62  0.48  0.54
posDown  0.32  0.15  0.45  0.24  0.05

尝试使用lege

mask = (df.le(df.loc['posUp'])       # compare with `posUp` row-wise
        & df.ge(df.loc['posDown'])   # compare with `posDown` row-wise
       ).all(1)                      # check for all True along the rows
df[mask]

Output:

         mes1  mes2  mes3  mes4  mes5
A1       0.45  0.21  0.53  0.33  0.11
posUp    0.52  0.40  0.62  0.48  0.54
posDown  0.32  0.15  0.45  0.24  0.05

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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