好的,我有一个像这样的pandas数据框:
lat long level date time value
3341 29.232 -15.652 10.0 20100109.0 700.0 0.5
3342 27.887 -13.668 120.0 20100109.0 700.0 3.2
...
3899 26.345 -11.234 0.0 20100109.0 700.0 5.8
索引编号奇怪的原因是因为它来自转换为pandas数据帧的csv,并且过滤了一些值。列level
,date
,time
并不真正相关。
我想在ipython
中看到按纬度过滤的部分行,所以我这样做(如果数据框为c
):
c[c['lat'] == 26.345]
或
c.loc[c['lat'] == 26.345]
我可以看到该值是否存在,但有时它不输出我在数据帧中看到的纬度值!?! (例如,我可以在数据框中看到纬度27.702的值,当我做c[c['lat'] == 27.702]
或c.loc[c['lat'] == 27.702]
时,我得到一个空的数据帧,我看到这个纬度的值)。这里发生了什么?
谢谢。
答案 0 :(得分:4)
这可能是因为您要求与浮点值完全匹配,这非常非常危险。它们是近似值,通常打印精度低于实际存储的精度。
很容易看到0.735471
打印出来,比如说,并认为这就是全部,实际上价值确实是0.73547122072282867
;显示功能简单地截断了结果。但是当你尝试对吸引人的短期价值进行严格的平等测试时,热潮。不起作用。
而不是
c[c['lat'] == 26.345]
尝试:
import numpy as np
c[np.isclose(c['lat'], 26.345)]
现在,您将获得在指定值的特定范围内的值。你can set the tolerance。
答案 1 :(得分:2)
提出准确的答案有点困难,因为问题不包含reproducible example,但让我试试。最有可能的是,这是floating point issues。您看到(并尝试与之比较)的数字可能与由于四舍五入而存储在内存中的数字不同。例如:
import numpy as np
x = 0.1
arr = np.array([x + x + x])
print(np.array([x + x + x]))
# [ 0.3]
print(arr[arr == 0.3])
# []
print(x + x + x)
# 0.30000000000000004
# in fact 0.1 is not exactly equal to 1/10,
# so 0.1 + 0.1 + 0.1 is not equal to 0.3
您可以使用np.isclose
代替==
来解决此问题:
print(np.isclose(arr, 0.3))
# [ True]
print(arr[np.isclose(arr, 0.3)])
# [ 0.3]
答案 2 :(得分:2)
除了解决浮点值比较的答案之外,lat
列中的某些值可能是字符串类型而不是数字。
使用pandas中的to_numeric()功能将它们转换为数字。
import pandas as pd
df['lat'] = pd.to_numeric(df['lat'])
# you can adjust the errors parameter as you need
df['lat'] = pd.to_numeric(df['lat'], errors='coerce')