如何检查DataFrame中所有值是否处于指定区间?isin方法误用原因及DataFrame区间检查方案
问题解析与解决方案
为什么df.isin([-1,1])返回全False?
你这里踩了个逻辑误区:isin()方法的作用是检查元素是否严格等于传入列表中的某一个值——也就是说它只会匹配恰好等于-1或者1的元素,但你的数据里都是0到1之间的小数,没有任何值刚好等于这两个端点,所以返回的结果全是False。这和你想要的「检查值是否处于[-1,1]区间内」的需求完全不匹配。
DataFrame级别的区间检查实现方法
虽然DataFrame没有直接的between属性,但我们有两种简单的方式实现类似Series的between功能:
方法一:布尔运算组合(推荐)
直接对整个DataFrame进行上下限比较,再用逻辑与(&)组合条件:
# 生成与原DataFrame形状一致的布尔DataFrame,标记每个元素是否在区间内 df_in_range = (df >= -1) & (df <= 1) # 快速验证所有元素是否都在[-1,1]区间内 all_values_valid = ((df >= -1) & (df <= 1)).all().all()
这里第一个.all()用于检查每一列的所有元素是否满足条件,第二个.all()则是确认所有列的检查结果都为True,最终得到整个DataFrame是否符合要求的布尔值。
方法二:利用apply复用Series的between
如果你已经习惯了Series的between方法,可以通过apply将其应用到DataFrame的每一列:
df_in_range = df.apply(lambda col: col.between(-1, 1))
这种方式本质上是对每一列单独调用between方法,再将结果组合成新的DataFrame,效果和方法一完全一致。
关于单列测试结果的说明
你用df["AAPL"].between(-1,1).any()得到True,是因为:
between(-1,1)会返回AAPL列每个元素是否在区间内的布尔Series.any()方法只要Series中有一个元素满足条件就会返回True
而你的AAPL列所有值都在0到1之间,显然都满足区间要求,所以结果为True。这和isin的匹配逻辑完全不同,因此会出现两种方法结果差异巨大的情况。
内容的提问来源于stack exchange,提问作者Lazer
相关产品推荐
相关产品推荐

