Python 3.x 连接两个没有相同键但具有匹配信息的列的数据帧

Python 3.x 连接两个没有相同键但具有匹配信息的列的数据帧,python-3.x,dataframe,merge,key,Python 3.x,Dataframe,Merge,Key,我想从另外两个数据帧(df1和df2)创建一个新的数据帧df3,这两个数据帧没有公共键,只有一个公共名称字段 df1: df2: 预期结果,在这种情况下:如果start_df1>start_df2&end_df1(df2.loc[k,'start_df2']))\ &(df1.loc[var[1],'end_df1']

我想从另外两个数据帧(df1和df2)创建一个新的数据帧df3,这两个数据帧没有公共键,只有一个公共名称字段

df1:

df2:

预期结果,在这种情况下:如果start_df1>start_df2&end_df1 df3

目标是创建df3(merge?),但如果df1和df2之间没有公共键列,我就无法创建

所以我第一次尝试了。复制:

df3 = df2[['contig', 'start_contig', 'end_contig']].copy()
但是我无法从df1获得信息

此外,创建第三个表会消耗资源,可能有更快的方法

我用3个嵌套循环尝试了这段代码,但它确实花费了太多时间:

nbExpected = 0
        for k, v in df2['name'].items() :
            for row in df1.groupby(['name']):
                # print(type(row))
                # print(row[1].index)
                for var in enumerate(row[1].index):
                    # print(var[1])
                    # print(df1.loc[var[1], 'start_df1'])
                    nbExpected += len(df1[(df2['name'] == v) \
                        & (df1.loc[var[1], 'start_df1'] > (df2.loc[k,'start_df2'])) \
                        & (df1.loc[var[1], 'end_df1'] < (df2.loc[k,'end_df2']))
                            ] )
        print('nbExpected', nbExpected)
nbExpected=0
对于df2['name']中的k,v。items():
对于df1.groupby(['name'])中的行:
#打印(类型(行))
#打印(行[1]。索引)
对于枚举中的变量(行[1]。索引):
#打印(变量[1])
#打印(df1.loc[var[1],“start\u df1]”)
nbExpected+=len(df1[(df2['name']==v)\
&(df1.loc[var[1],'start_df1']>(df2.loc[k,'start_df2']))\
&(df1.loc[var[1],'end_df1']<(df2.loc[k,'end_df2']))
] )
打印('nbExpected',nbExpected)

提前感谢。

大家好,欢迎来到stackoverflow。请使用正确的代码格式,因为您的问题很难阅读,请提供一个小的数据示例,而不仅仅是您所有的代码。感谢MichaelJanz的及时回复和建议。这是一个Rewrdinghi,欢迎来到stackoverflow。请使用正确的代码格式,因为您的问题很难阅读,请提供一个小的数据示例,而不仅仅是您所有的代码。感谢MichaelJanz的及时回复和建议。这是一个改写
key? name             start_df2   end_df2 start_df1  end_df1 key1                                                                                             
?    paul             635         962     640        700     info2  
?    paul             635         962     700        801     info3 
?    pierre           941         1318    NA         NA          NA 
df3 = df2[['contig', 'start_contig', 'end_contig']].copy()
nbExpected = 0
        for k, v in df2['name'].items() :
            for row in df1.groupby(['name']):
                # print(type(row))
                # print(row[1].index)
                for var in enumerate(row[1].index):
                    # print(var[1])
                    # print(df1.loc[var[1], 'start_df1'])
                    nbExpected += len(df1[(df2['name'] == v) \
                        & (df1.loc[var[1], 'start_df1'] > (df2.loc[k,'start_df2'])) \
                        & (df1.loc[var[1], 'end_df1'] < (df2.loc[k,'end_df2']))
                            ] )
        print('nbExpected', nbExpected)