データフレームがあり、数値の範囲があります。特定の列の値がその範囲内にある行を見つけたいです。
これは些細な仕事のように思えます。私はここで与えられたテクニックを試しました - http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-boolean
簡単な例を挙げました:
In [6]: df_s
Out[6]:
time value
0 1 3
1 2 4
2 3 3
3 4 4
4 5 3
5 6 2
6 7 2
7 8 3
8 9 3
In [7]: df_s[df_s.time.isin(range(1,8))]
Out[7]:
time value
0 1 3
1 2 4
2 3 3
3 4 4
4 5 3
5 6 2
6 7 2
次に、タイムスタンプと値を列として持つ、作業中のデータセットのサンプルを試しました。
In [8]: df_s = pd.DataFrame({'time': range(1379945743841,1379945743850), 'value': [3,4,3,4,3,2,2,3,3]})
In [9]: df_s
Out[9]:
time value
0 1379945743841 3
1 1379945743842 4
2 1379945743843 3
3 1379945743844 4
4 1379945743845 3
5 1379945743846 2
6 1379945743847 2
7 1379945743848 3
8 1379945743849 3
In [10]: df_s[df_s.time.isin(range(1379945743843,1379945743845))]
Out[10]:
Empty DataFrame
Columns: [time, value]
Index: []
この場合、同じ手法が機能しないのはなぜですか? 私は何を間違っていますか?
別のアプローチを試しました:
In [11]: df_s[df_s.time >= 1379945743843 and df_s.time <=1379945743845]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-45c44def41b4> in <module>()
----> 1 df_s[df_s.time >= 1379945743843 and df_s.time <=1379945743845]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
次に、もう少し複雑なアプローチを試みました。
In [13]: df_s.ix[[idx for idx in df_s.index if df_s.ix[idx]['time'] in range(1379945743843, 1379945743845)]]
Out[13]:
time value
2 1379945743843 3
3 1379945743844 4
これにより目的の結果が得られますが、元のデータセットで結果を得るには時間がかかりすぎます。209920行あり、実際にコードをテストしてみると行数が増えることが予想されます。
誰かが私に正しいアプローチを向けることができますか?
私はpython 2.7.3とpandas 0.12.0を使用しています
アップデート:
ジェフの答えはうまくいきました。
しかし、このisin
アプローチはよりシンプルで直感的で、すっきりしていると思います。失敗した理由を誰かが知っている場合はコメントしてください。
ありがとう!