[英]Merging Dataframes within loop - Pandas is slow
我正在使用功能segmentMatch
在其中我要發送兩個數據幀。 我正在通過一個數據框使用for
循環,並在與具有循環變量的另一個數據框合並之前有一些條件要檢查。 它給了我一個完美的答案,但是因為兩個數據幀都太大,所以速度太慢。
有什么辦法可以提高速度。
def segmentMatch(self, df, df_program):
df_result = []
for i, rview in df.iterrows():
df_tmp = []
df1 = []
df_tmp = df_program.ix[(df_program.iD == rview['id']) &
(rview['end_time'] >= df_program.START_TIME) &
(rview['start_time'] <= df_program.END_TIME)]
df1 = rview.to_frame().transpose()
tmp = pd.merge(df1, df_tmp,how='left')
df_result.append(tmp)
result = pd.concat(df_result, axis=0)
del(df1, df_tmp, tmp)
return result
請幫我。 我正在使用Visual Studio代碼和Python 3.6
提前致謝。
在一般的建議是從來沒有通過數據幀循環,如果能夠避免它。 與任何merge
或join
相比,循環非常慢。
有條件的聯接在大熊貓中不是很好。 但是,它們在SQL中非常簡單。 一個小小的生活黑客可能是pip install pandasql
並實際使用SQL。 另請參閱此處 。 下面的示例未經測試。
import pandasql as ps
sqlcode = '''
SELECT *
FROM df
JOIN df ON 1=1
AND df_program.iD = df.id
AND df.end_time >= df_program.START_TIME
AND df.start_time <= df_program.END_TIME
'''
new_df = ps.sqldf(sqlcode, locals())
如果您不想使用pandassql
,建議您稍后合並並檢查條件。 當然,這需要更多的內存,具體取決於ID的重疊。 同樣,沒有數據會有些棘手,但是
full_df = df.join(df, on='id', rsuffix='program_')
filtered_df = df.loc[(df.end_time >= df.program_START_TIME) & (df.start_time <= df.program_END_TIME)
如果它不適合內存,則可以嘗試使用dask數據框執行相同的操作 。
import dask.dataframe as dd
# Read your CSVs in like this
df = dd.read_csv('')
df_program = dd.read_csv('')
# Now make sure your ids are index in both dataframes
# Join and filter like above
full_df = df.join(df, on='id', rsuffix='program_')
filtered_df = df.loc[(df.end_time >= df.program_START_TIME) & (df.start_time <= df.program_END_TIME)
# Write the result to a CSV or convert to pandas (if it fits your memory anyway):
df = full_df.compute()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.