如何在Pandas中检查列的任何值是否在范围内(在两个值之间)?

lc8prwob  于 2023-09-29  发布在  其他
关注(0)|答案(6)|浏览(123)

我有一个DataFrame,我想检查列的任何值(v)是否满足x<=v<=y

equal = any(df['columnX'] == value) # No problems here
in_between = any(x <= df['columnX'] <= y) # ValueError :/

我得到的错误是ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().,但我已经在使用any()了!
那有什么问题吗为什么它可以在==上工作,而不能在x<=v<=y上工作?

5cnsuln7

5cnsuln71#

使用between来实现,它还支持是否通过inclusive arg包含范围值:

In [130]:
s = pd.Series(np.random.randn(5))
s

Out[130]:
0   -0.160365
1    1.496937
2   -1.781216
3    0.088023
4    1.325742
dtype: float64

In [131]:
s.between(0,1)

Out[131]:
0    False
1    False
2    False
3     True
4    False
dtype: bool

然后在上面调用any

In [132]:
s.between(0,1).any()

Out[132]:
True
okxuctiv

okxuctiv2#

你只能有两个条件:

df[(x <= df['columnX']) & (df['columnX'] <= y)]

这一行将选择df中满足条件的所有行。

kqqjbcuj

kqqjbcuj3#

您可以使用自定义函数在dataframe上运行:

df1 = pd.DataFrame({'a':[1,1,2,2], 'b':[1,1,2,2], 'c':[2,-1,4,5]})
myfun = lambda row: row['b']<=row['a']<=row['c']
df1['Result'] = df1.apply(myfun, axis=1)
display(df1)
zdwk9cvp

zdwk9cvp4#

如果您想查看其他列值,可以尝试

df.loc[ df.loc[:, 'columnX'].between(a, b), : ]
sirbozc5

sirbozc55#

另一种方法是使用query

In [2]: df = pd.DataFrame({'num': range(0, 5), 'alpha': list('ABCDE')})

In [3]: df
Out[3]: 
   num alpha
0    0     A
1    1     B
2    2     C
3    3     D
4    4     E

In [4]: df.query('1 <= num <= 3')
Out[4]: 
   num alpha
1    1     B
2    2     C
3    3     D
juzqafwq

juzqafwq6#

你也可以使用numpy stlye的compare by rows进行比较:

df1 = pd.DataFrame({'a':[1,1,2,2], 'b':[1,1,2,2], 'c':[2,-1,4,5]})
#    a  b  c
# 0  1  1  2
# 1  1  1 -1
# 2  2  2  4
# 3  2  2  5

upper_limit = np.atleast_2d([2,0,2,3]).T
# [[2]
#  [0]
#  [2]
#  [3]]

lower_limit = np.atleast_2d([-2,-1,0,-3]).T
# [[-2]
#  [-1]
#  [ 0]
#  [-3]]

(lower_limit <= df1) & (df1 <= upper_limit)
#        a      b      c
# 0   True   True   True
# 1  False  False   True
# 2   True   True  False
# 3   True   True  False

相关问题