Python 在循环中合并数据帧-熊猫很慢

Python 在循环中合并数据帧-熊猫很慢,python,pandas,Python,Pandas,我正在使用函数segmentMatch,其中我正在发送两个数据帧。我在一个数据帧中使用for循环,在使用循环变量与另一个数据帧合并之前,需要检查一些条件。它给了我一个完美的答案,但因为两个数据帧都太大,所以速度太慢 有什么办法可以提高速度吗 def segmentMatch(self, df, df_program): df_result = [] for i, rview in df.iterrows(): df_tmp = [] df1 =

我正在使用函数
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
def段匹配(self、df、df_程序):
df_结果=[]
对于i,df.iterrows()中的rview:
df_tmp=[]
df1=[]
df_tmp=df_program.ix[(df_program.iD==rview['iD'])和
(rview['end_time']>=df_程序.开始时间)&

(rview['start_time']一般来说,如果可以避免,建议不要在数据帧中循环。与任何
合并
加入
相比,循环速度非常慢

pandas中的条件连接不是很好。但是在SQL中它们非常容易。一个小的lifehack可以是
pip安装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())
如果它不适合内存,您可以尝试对数据帧执行同样的操作

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()
导入dask.dataframe作为dd
#像这样读你的CSV
df=dd.read_csv(“”)
df_程序=dd.read_csv(“”)
#现在确保您的ID在两个数据帧中都是索引
#像上面那样加入并过滤
full_df=df.join(df,on='id',rsuffix='program')

过滤的df=df.loc[(df.end\u time>=df.program\u START\u time)&(df.start_time两个数据帧的大小是多少?您能添加吗?例如,对于每个数据帧,5行3列?df=11列,超过100000行,而df_program=7列,40000行谢谢您的回复。我将尝试使用SQL。是否有其他方法可以在不使用SQL的情况下改进我的代码。添加了一个建议-认为您可以加入n等式和筛选器作为第二步:)再次感谢。我已尝试使用join(),因为它在加入后进行筛选,它会删除条件不匹配的所有数据。我希望所有数据都来自df+匹配df_程序中的数据。请再次帮助。此外,当我尝试加入所有记录时,它会给我内存错误,因为太大的数据帧无法加入。添加了另一个选项:)
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()