2015-05-05 26 views
1

我有一個包含320k行和450列的小型數據框。還有一些列表的列號:Python/Pandas:替換大型數據集的多列中的某些值

list1 = [1,3,5,...] 
list2 = [4,9,...] 
... 

我的目標是從當前列表中的每一列替換某些值,然後將其保存:

df[df[list1] > 7] = np.nan 
df[df[list2] >90] = np.nan 
... 

數據幀的大小讓我做它由大塊:

for chunk in pd.read_csv(filePrev,chunksize=10000,header=None): 
>>> chunk[chunk[list1] >= 7] = np.nan 
>>> chunk[chunk[list2] >= 90] = np.nan 
... 
>>> chunk.to_csv(newFile,mode='a',header=False,index=False) 

但有一個不正確的工作:我運行這段代碼很多次,而且大多是無法完成的工作(在IPython的內存錯誤或應用程序只是由Windows關閉),機智h任何塊大小的值。但是當它完成時,它將大部分字符串中的所有值都替換爲NaN,並且有一些字符串被全部正確替換。


我已經嘗試了相同的數據集的小片上的相同的邏輯,它工作正常!

In [11]: df = pd.read_csv(filePrev,nrows=5,usecols=[1,2,3,4,5,6,7],header=None) 

In [12]: df 
Out[12]: 
    1 2 3 4 5 6 7 
0 1 1 1 1 1 1 1 
1 3 1 1 1 2 1 1 
2 3 1 1 1 1 1 1 
3 3 1 1 1 2 1 2 
4 3 1 1 1 1 1 1 

In [13]: list = [1,7] 

In [14]: df[df[list] > 1] = np.nan 

In [15]: df 
Out[15]: 
    1 2 3 4 5 6 7 
0 1 1 1 1 1 1 1 
1 NaN 1 1 1 2 1 1 
2 NaN 1 1 1 1 1 1 
3 NaN 1 1 1 2 1 NaN 
4 NaN 1 1 1 1 1 1 

那麼,有關它的任何想法?我們可以用「chunking」模式來實現嗎,還是有另一種方式(那麼我需要一個例子)?我只是想更換某些數值爲NaN ... :)

+0

這可能是因爲您選擇數據的方式會返回副本。嘗試使用選擇http://pandas.pydata.org/pandas-docs/stable/indexing.html – canyon289

回答

1

問題出在代碼處理某些列。有這樣的字符串:

chunk[chunk[393] > 50] = np.nan 

代替

chunk[chunk[[393]] > 50] = np.nan 

如果有N:

塊[393] [N]> 50

那麼所有的行轉換爲NaN陣列


謝謝大家的幫助。

1

這是可能的,這可以通過保持文件打開,而不是每次打開文件追加模式進行改進:

with open(newFile, 'a') as f: 
    for chunk in pd.read_csv(filePrev,chunksize=10000,header=None): 
     chunk[chunk[list1] >= 7] = np.nan 
     chunk[chunk[list2] >= 90] = np.nan 
     chunk.to_csv(f, header=False, index=False) 

有人最近在這裏報告了這種行爲,並且這一變化在Windows上給了他們a 98.3% performance gain(我在osx上只看到了大約25%)。


如果您用配置文件或(IPython中的)%PRUN Python代碼,你可以看到什麼東西被要求最多的時間和最函數調用。在question I was referring to above的情況下,大部分時間是花費在Python的close功能(的pd.read_csv每次通話後關閉,除非你把文件打開。)


注:邏輯看起來不錯,你並沒有使用複製。正如你可以在你的小例子中看到的:代碼工作!

相關問題