Pandas按列值选择,奇怪的行为

时间:2016-11-24 15:48:04

标签: python pandas

好的,我有一个像这样的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,并且过滤了一些值。列leveldatetime并不真正相关。

我想在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]时,我得到一个空的数据帧,我看到这个纬度的值)。这里发生了什么?

谢谢。

3 个答案:

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