2017-09-28 49 views
0

我有一個10000s的大型數據框,我想選擇它的一個子集。我正在使用的是提高在Python中選擇數據框的子集的性能

newdf = df[[column for column in df if "exclude_me" is not in column]] 

但這需要數小時才能計算。是否有更快的解決方法,如將其轉換爲矩陣或使用numpy?

+2

恩,這真的不應該花幾個小時。 –

+0

'熊貓'**已經在引擎蓋下使用'numpy'。 –

+0

其實我剛剛停止計算它不是10000s它的470000列和70行...... – horseshoe

回答

0

有趣的是,使用帶有ILOC而不是名稱的位置索引的速度要快得多

newdf= df.iloc[:,[ind for ind,col in enumerate(df.columns) if "exclude_me" not in col]] 
0

沒有更多的信息或數據集可以運行,這是一個猜測遊戲,無論問題是從收集列名還是從切分DataFrame開始。由於切片應該用熊貓快,所以我會首先查看列計算。

這應該給你相同的結果,但可能會更快的大量列:

columns = list(val for val in my_dataframe.columns.values if "exclude_me" is not in val) newdf = df[columns]

+0

呵呵?爲什麼在'list'中包裝一個生成器表達式會比列表理解更快* –

+0

我試過這個ine以及它是切片...即使我只刪除一列,也需要永久。 Deepcopy正常工作 – horseshoe

+0

@ juanpa.arrivillaga與OP相比,我的方法的差異在於對dataframe.columns.values進行迭代,而不是遍歷數據幀本身。當然,你也可以使用列表理解(或者只是將一個生成器傳遞給數據框 - 儘管我不知道大熊貓是否可以處理它)。 – MrTrustworthy