我正在根据形状为(135150, 12)
的DataFrame进行一些数据处理,因此手动重复检查我的结果不再适用。
当我尝试检查元素是否属于数据框或给定列时,我遇到了一些“奇怪”的行为。
对于更小的数据帧,此行为可重现,如下所示:
import numpy as np
import pandas as pd
start = 1e-3
end = 2e-3
step = 0.01e-3
arr = np.arange(start, end+step, step)
val = 0.0019
df = pd.DataFrame(arr, columns=['example_value'])
print(val in df) # prints `False`
print(val in df['example_value']) # prints `True`
print(val in df.values) # prints `False`
print(val in df['example_value'].values) # prints `False`
print(df['example_value'].isin([val]).any()) # prints `False`
由于我是数据分析的初学者,我无法解释这种行为。
我知道我正在使用涉及不同数据类型的不同方法(例如pd.Series
,np.ndarray
或np.array
),以检查数据帧中是否存在给定值。此外,在使用np.array
或np.ndarray
时,机器的准确性也会起作用,我已经意识到这一点。
但是,最后,我需要实现几个函数来过滤数据帧并计算某些值的出现次数,这是我之前基于布尔列结合执行的操作(如>
和<
成功。
但是在这种情况下,我需要按照确切的值进行过滤并计算其出现次数,这毕竟导致了上述问题。
所以有人可以解释一下,这里发生了什么?
答案 0 :(得分:3)
Divakar建议,潜在的问题是浮点精度。因为DataFrames / Series是建立在numpy之上的,所以使用numpy方法并不是一个很好的惩罚,所以你可以这样做:
df['example_value'].apply(lambda x: np.isclose(x, val)).any()
或
np.isclose(df['example_value'], val).any()
两者都正确返回True
。