0

データフレームがあり、数値の範囲があります。特定の列の値がその範囲内にある行を見つけたいです。

これは些細な仕事のように思えます。私はここで与えられたテクニックを試しました - 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アプローチはよりシンプルで直感的で、すっきりしていると思います。失敗した理由を誰かが知っている場合はコメントしてください。

ありがとう!

4

1 に答える 1

4

この方法を試してください

In [7]:  df_s = pd.DataFrame({'time': range(1379945743841,1379945743850), 'value': [3,4,3,4,3,2,2,3,3]})

ms エポック タイムスタンプを実際の時間に変換する

In [8]: df_s['time'] = pd.to_datetime(df_s['time'],unit='ms')

In [9]: df_s
Out[9]: 
                        time  value
0 2013-09-23 14:15:43.841000      3
1 2013-09-23 14:15:43.842000      4
2 2013-09-23 14:15:43.843000      3
3 2013-09-23 14:15:43.844000      4
4 2013-09-23 14:15:43.845000      3
5 2013-09-23 14:15:43.846000      2
6 2013-09-23 14:15:43.847000      2
7 2013-09-23 14:15:43.848000      3
8 2013-09-23 14:15:43.849000      3

これらは変換されたエンドポイントです

In [10]: pd.to_datetime(1379945743843,unit='ms')
Out[10]: Timestamp('2013-09-23 14:15:43.843000', tz=None)

In [11]: pd.to_datetime(1379945743845,unit='ms')
Out[11]: Timestamp('2013-09-23 14:15:43.845000', tz=None)

In [12]: df = df_s.set_index('time')

&かっこを使用する必要があります

In [13]: df_s[(df_s.time>pd.to_datetime(1379945743843,unit='ms')) & (df_s.time<pd.to_datetime(1379945743845,unit='ms'))]
Out[13]: 
                    time  value
3 2013-09-23 14:15:43.844000      4

0.13 (近日公開予定) では、次のことが可能になります。

In [7]: df_s.query('"2013-09-23 14:15:43.843" < time < "2013-09-23 14:15:43.845"')
Out[7]: 
                    time  value
3 2013-09-23 14:15:43.844000      4

あなたの isin アプローチは機能します。なぜうまくいかないのかわかりません。

In [11]: df_s[df_s.time.isin(range(1379945743843,1379945743845))]
Out[11]: 
            time  value
2  1379945743843      3
3  1379945743844      4
于 2013-09-29T14:29:26.327 に答える