2016-11-24 2 views
2

[OK]を、私は持っている。このようなパンダのデータフレーム:パンダ、奇妙な行動

  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.73547122072282867のときには、それはすべてあると思うと、0.735471が表示されていることは非常に簡単です。表示機能は単に結果を切り捨てただけです。しかし、あなたが魅力的な短い値で厳密な平等テストをしようとすると、ブーム。動作しません。

代わりの

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

@ジョナサンにコメントしたいのであれば、彼の答えにコメントするのが良いと思います。(これは一番上です) –

+1

ありがとう、イリーヤですが、コメントのヘルプセクションには、 @ジョナサンを言及し、彼は以前のコメントにも彼はコメントを受け取っている;) – David

2

浮動小数点値の比較を扱う答えに加えて、lat列の値の一部は数値ではなく文字列型です。

EDIT:これは問題ではないことを示しましたが、他の人に役立つようにこの回答を残しておきます。:)

パンダの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')