2013-09-24 210 views
1

我是熊貓的新手,我正試圖將它應用到我已經寫過的腳本。 我有一個csv文件,我從中提取數據,並使用我的數據框的列'候選','最終曲目'和'狀態'。用熊貓過濾數據

我的問題是,我想過濾數據,也許使用Wes Mckinney的10分鐘教程('http://nbviewer.ipython.org/urls/gist.github.com/wesm/4757075/raw/a72d3450ad4924d0e74fb57c9f62d1d895ea4574/PandasTour.ipynb')中顯示的方法。在In [80]:部分,他使用aapl_bars.close_price['2009-10-15']

我想用類似的方法來選擇所有具有*作爲狀態的數據。如果該行中沒有*,則其他列的數據也會被刪除。

此刻我代碼

def establish_current_tacks(filename): 

    df=pd.read_csv(filename)  
    cols=[df.iloc[:,0], df.iloc[:,10], df.iloc[:,11]] 
    current_tracks=pd.concat(cols, axis=1) 
    return current_tracks 

數據幀

>>> current_tracks 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 707 entries, 0 to 706 
Data columns (total 3 columns): 
candidate  695 non-null values 
final track 670 non-null values 
status   670 non-null values 
dtypes: float64(1), object(2) 

我想用一些諸如current_tracks.status['*'],但這不起作用

如果這是顯而易見的道歉,爲了讓我的頭腦得到解決而掙扎一點。

+1

當你在讀取csv後過濾你的cols時,像''df = read_csv(filename,usecols = [0,10,11])'這樣''read_csv'的調用過濾效率會更高,或者你可以通過列名稱列表'df = read_csv(filename,usecols = ['candidate','final track','status'])'它將會加載得更快更快 – EdChum

+0

Cheers Ed。我有兩個問題,1.你解釋的兩種方法不會產生相同的結果?(第一個給出我想要的結果.2)。你將如何索引這些列與列名稱? –

+0

我認爲列名與輸出結果是一樣的,可能它們不是,這就可以解釋1.第二個代碼片段是正確的語法和形式,但由於某種原因,不會產生相同的結果,您會需要理解爲什麼,你可以閱讀更多關於參數[這裏](http://pandas.pydata.org/pandas-docs/stable/io.html#csv-text-files) – EdChum

回答

2

既然你要根據過濾數據是不是數據幀的指數的一部分,而是一個專欄,你需要做的是這樣的:

current_tracks[current_tracks.status == '*'] 

完整的示例:

import pandas as pd 
current_tracks = pd.DataFrame({'candidate': ['Bob', 'Jim', 'Alice'], 
'final_track': [10, 15, 13], 'status': ['*', '.', '*']}) 
current_tracks 
Out[3]: 
    candidate final_track status 
0  Bob   10  * 
1  Jim   15  . 
2  Alice   13  * 

current_tracks[current_tracks.status == '*'] 
Out[4]: 
    candidate final_track status 
0  Bob   10  * 
2  Alice   13  * 

如果status是你的數據幀的指數的一部分,你的原始語法會工作:

current_tracks = current_tracks.set_index('status') 
current_tracks.candidate['*'] 
Out[8]: 
status 
*   Bob 
*   Alice 
Name: candidate, dtype: object 
+0

謝謝@Marius我正在嘗試使用第二個'set_index'部分。我得到錯誤'KeyError:u'no item named status'' –

+1

看着你的DataFrame,它看起來像'''status'''列實際上被命名爲'''status'''有一個前導空格。也許你解析它有趣?嘗試顯式重命名列(''current_tracks.columns = ['candidate','final_track','status']'')並查看它是否有效。 –