#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 за ваш быстрый ответ и советы. Вот изменение формулировки