我有一個數據框,我有一個數字範圍。我想查找特定列中的值位於該範圍內的行。從滿足熊貓條件的數據框中獲取行
這似乎是一件小事。我想在這裏給出的技術 - 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
方法更簡單,直觀,更少混亂。請評論,如果有人有任何想法爲什麼失敗。
謝謝!
'df_s [df_s.time.isin(range(1379945743843,1379945743845))]'適合我(python 2.7,pandas 0.12。0) –
不知道爲什麼它不起作用在我的系統上。如果任何人有任何想法,爲什麼第一個isin'方法失敗,請評論。謝謝! – Geekster