2016-11-24 280 views
2

好吧,我有一個熊貓數據幀是這樣的:大熊貓的列值選擇行,奇怪的行爲

  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 

指數的陌生號碼的原因是因爲它來自一個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]時,我得到一個空的數據框,並且我看到了這種緯度的值)。這裏發生了什麼?

謝謝。

+1

所有'lat'值都是數字嗎?其中一些可能是字符串,所以當你檢查數字的平等時,它不會返回任何東西。檢查列的類型。如果它是'對象',那就是發生了什麼。您可以使用熊貓[to_numeric()](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_numeric.html)函數進行轉換。 – 3novak

+0

不,我恐怕我已經完成了'pd.to_numeric'並且它是一樣的...... – David

回答

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

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] 
+0

@Jonathan問題在於浮點數量。我以前從未有過浮動的情況,而且我也沒有想到浮動的表示可能是關鍵。 Thanxs。 – David

+0

如果你想對@Jonothan發表評論,最好是對他的回答發表評論,我相信:)(它現在在頂部。) –

+1

謝謝,Ilya,但在評論的幫助部分寫道,如果你提@Jonathan和他在之前的評論中他也收到了評論;) – David

2

除了解決浮點值比較問題的答案之外,lat列中的某些值可能是字符串類型而不是數字。

編輯:你表示這不是問題,但我會在這裏留下這個迴應以防別人幫助別人。:)

使用熊貓的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')