2015-09-28 45 views
1

我試圖追加或添加行到現有的數據庫有大約700萬行。如何加速追加到現有的數據幀

現在我面臨的挑戰是,我能夠以下列方式使用iterrows做相同的:

for key,value in df.iterrows(): 
       if value['col3'] > 0: 
        df.loc[len(df),['col1','col2','col3','col4','col5']] = [value['col1']+value['col3'],value['col2'],value['col3'],value['col4'],'blah'] 

,並在下述方式使用itertuples

for tup in df.itertuples(index = False): 
       if tup[4] > 0: 
        df.loc[len(df),['col1','col2','col3','col4','col5']] = [tup[1]+ tup[3],tup[2], tup[3],tup[4],'blah'] 

這兩種做這項工作,但它正在處理時間。

有人可以建議我一個更好的方法來做到這一點在Python熊貓?

+0

你能解釋一下你想在這裏做什麼,追加行是高度非高性能,因爲它需要成長和可能複製內容定期,例如在你的第一個循環中,你所做的就是複製所有的行值,除了col3,你要添加col1。 – EdChum

+0

@EdChum我想在這裏實現的是,我有一個開始時間轉換爲時間和花在應用程序上的時間秒,這是需要添加給我2行1與應用程序使用的開始時間和應用程序的停止時間使用。 我這樣做的原因是,我想要捕獲的開始和結束時間之間可能會有點擊事件來處理數據 –

回答

1

您可以使用np.where,如果你需要的條件追加行:

import pandas as pd 
import numpy as np 
import io 

#original data 
temp=u"""col1,col2,col3,col4,col5 
1,2,3,4,5 
3,4,-5,6,7 
5,6,-7,8,9""" 

df1 = pd.read_csv(io.StringIO(temp)) 
print df1 
# col1 col2 col3 col4 col5 
#0  1  2  3  4  5 
#1  3  4 -5  6  7 
#2  5  6 -7  8  9 

#copy data for next processing 
df = df1.copy() 

#set data by conditions 
df1['col1'] = np.where(df1['col3'] > 0, df1['col1'] + df1['col3'], np.NaN) 
df1['col5'] = np.where(df1['col3'] > 0, 'blah', np.NaN) 

#drop rows with NaN 
df1 = df1.dropna() 

#append to original df 
result = pd.concat([df, df1], ignore_index=True) 
print result 
# col1 col2 col3 col4 col5 
#0  1  2  3  4  5 
#1  3  4 -5  6  7 
#2  5  6 -7  8  9 
#3  4  2  3  4 blah  
+0

提供的解決方案在修改數據框時非常棒,這裏的問題是我必須增長數據幀,來實現所需的。 我有的問題是 我有一個開始時間轉換爲紀元和花在應用程序上的時間在幾秒鐘內,這是需要添加給我2行一與應用程序使用的開始時間和應用程序使用的停止時間。我這樣做的原因是,我想要捕獲的開始和停止時間之間有點擊事件來處理數據 –

+0

解決方案被修改... – jezrael

+0

感謝@jezrael這工作像一個寶石,但我仍然好奇,如果而不是僅僅將其複製到新的數據框並對其執行操作,我們是否可以有更好的解決方案。對於較小的數據集,這種方法效果非常好,但更大的數據框就像每個數據框中有1000萬條記錄會打擊我的計算資源。 –