объединяет два фрейма данных без одинаковых ключей, но со столбцом с соответствующей информацией

#python-3.x #dataframe #merge #key

#python-3.x #фрейм данных #слияние #Клавиша

Вопрос:

Я хотел бы создать новый фрейм данных df3 из двух других (df1 и df2), у которых нет общего ключа, но есть общее поле имени.

df1 :

 key1    start_df2   end_df1   name                                                                                              
info1    0          101       paul       
info2    640        700       paul        
info3    700        801       pierre  

   
     
  

df2 :

 key2 name              start_df2   end_df2                                                                                              
0    paul               635         962    
1    pierre             941         1318    
2    jacques            102         587       
  

Ожидаемые результаты, при этом условии: если start_df1> start_df2 amp; end_df1 < end_df2, то информация 1 для paul в df1 не может быть указана в df3, но info2 и info3 для paul в порядке.

df3

 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 (объединить?) но я не могу создать без общего ключевого столбца между df1 и df2.

Итак, я сначала попробовал .copy :

 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) 
                        amp; (df1.loc[var[1], 'start_df1'] > (df2.loc[k,'start_df2'])) 
                        amp; (df1.loc[var[1], 'end_df1'] < (df2.loc[k,'end_df2']))
                            ] )
        print('nbExpected', nbExpected)
  

Заранее спасибо.

Комментарии:

1. Привет и добро пожаловать в stackoverflow. Пожалуйста, используйте правильное форматирование кода, поскольку ваш вопрос с трудом читается, и предоставьте небольшую выборку данных, а не только весь ваш код.

2. Спасибо MichaelJanz за ваш быстрый ответ и советы. Вот изменение формулировки