pandas:检查元素是否在数据框中或给定列导致奇怪的结果

时间:2016-07-18 19:03:27

标签: python numpy pandas element

我正在根据形状为(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.Seriesnp.ndarraynp.array),以检查数据帧中是否存在给定值。此外,在使用np.arraynp.ndarray时,机器的准确性也会起作用,我已经意识到这一点。

但是,最后,我需要实现几个函数来过滤数据帧并计算某些值的出现次数,这是我之前基于布尔列结合执行的操作(如><成功。

但是在这种情况下,我需要按照确切的值进行过滤并计算其出现次数,这毕竟导致了上述问题。

所以有人可以解释一下,这里发生了什么?

1 个答案:

答案 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