2013-09-29 89 views
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和熊貓0.12.0

更新:

傑夫的回答工作。

但我覺得isin方法更簡單,直觀,更少混亂。請評論,如果有人有任何想法爲什麼失敗。

謝謝!

+0

'df_s [df_s.time.isin(range(1379945743843,1379945743845))]'適合我(python 2.7,pandas 0.12。0) –

+0

不知道爲什麼它不起作用在我的系統上。如果任何人有任何想法,爲什麼第一個isin'方法失敗,請評論。謝謝! – Geekster

回答

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

謝謝@Jeff!圓括號和'&'做了詭計!它甚至沒有轉換成實際的時間。進行時間轉換有沒有好處?我很好奇爲什麼'isin'技術不能用於我的數據集? – Geekster

+0

正在等待此更新。 'df.query'一定會讓生活更輕鬆。 – Geekster

+0

你的「isin」方法確實有效,不知道爲什麼它不適合你。 – Jeff