![](/img/trans.png)
[英]How to select pandas rows when a cell value is between two values and the next cell or cells are between the same values?
[英]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
尝试使用le
和ge
:
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.