簡體   English   中英

在循環中合並數據幀-熊貓很慢

[英]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

提前致謝。

在一般的建議是從來沒有通過數據幀循環,如果能夠避免它。 與任何mergejoin相比,循環非常慢。

有條件的聯接在大熊貓中不是很好。 但是,它們在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM