pandas:检查元素是否在数据框或给定列中导致奇怪的结果
pandas: check whether an element is in dataframe or given column leads to strange results
我正在基于 (135150, 12)
形状的 DataFrame 进行一些数据处理,因此手动仔细检查我的结果不再适用。
我在尝试检查某个元素是否属于数据框或给定列时遇到了一些 'strange' 行为。
使用更小的数据帧可以重现此行为,如下所示:
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
时,机器精度会发挥作用,我知道这一点。
但是,最后,我需要实现几个函数来过滤数据帧并计算某些值的出现次数,我之前已经根据布尔列结合执行的操作(如 >
和 <
成功。
但在这种情况下,我需要按确切值进行过滤并计算它的出现次数,这最终导致我遇到了上述问题。
谁能解释一下,这是怎么回事?
正如 Divakar 所建议的,根本问题是浮点精度。因为 DataFrames/Series 是建立在 numpy 之上的,所以使用 numpy 方法并没有真正的惩罚,所以你可以这样做:
df['example_value'].apply(lambda x: np.isclose(x, val)).any()
或
np.isclose(df['example_value'], val).any()
两者都正确 return True
.
我正在基于 (135150, 12)
形状的 DataFrame 进行一些数据处理,因此手动仔细检查我的结果不再适用。
我在尝试检查某个元素是否属于数据框或给定列时遇到了一些 'strange' 行为。
使用更小的数据帧可以重现此行为,如下所示:
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
时,机器精度会发挥作用,我知道这一点。
但是,最后,我需要实现几个函数来过滤数据帧并计算某些值的出现次数,我之前已经根据布尔列结合执行的操作(如 >
和 <
成功。
但在这种情况下,我需要按确切值进行过滤并计算它的出现次数,这最终导致我遇到了上述问题。
谁能解释一下,这是怎么回事?
正如 Divakar 所建议的,根本问题是浮点精度。因为 DataFrames/Series 是建立在 numpy 之上的,所以使用 numpy 方法并没有真正的惩罚,所以你可以这样做:
df['example_value'].apply(lambda x: np.isclose(x, val)).any()
或
np.isclose(df['example_value'], val).any()
两者都正确 return True
.