Объединить два Pandas фрейма данных на перекрывающихся сегментах - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть два pandas кадра данных, и мне нужно сопоставить строки, если два столбца (с координатами start и end) перекрываются без пересечения границ.

Например:

df_1 = pd.DataFrame(data={'start': [0, 10, 23, 35], 'end': [5, 17, 28, 41], 'some_data_1': ['AA', 'BB', 'CC', 'DD']})
df_2 = pd.DataFrame(data={'start': [0, 12, 23, 55], 'end': [5, 17, 25, 62], 'some_data_2': ['AA_AA', 'BB_BB', 'CC_CC', 'DD_DD']})

Где

df_1 :
    start   end some_data_1
        0     5          AA
       10    17          BB
       23    28          CC
       35    41          DD

и

df_2 :
    start   end some_data_2
        0     5       AA_AA
       12    17       BB_BB
       23    25       CC_CC
       55    62       DD_DD

и желаемый результат:

df_1_2 :
    start_1 end_1   start_2 end_2  some_data_1  some_data_2
          0     5         0     5           AA        AA_AA
         10    17        12    17           BB        BB_BB
         23    28        23    25           CC        CC_CC
         35    41       NaN   NaN           DD          NaN
        NaN   NaN        55    62          NaN        DD_DD       

Существует ли элегантный способ проверить, является ли один сегмент (задается end - start) перекрывается с другим и, если они есть, объединить фрейм данных при этом условии.

Спасибо!

1 Ответ

2 голосов
/ 21 февраля 2020

Создайте условное выражение, чтобы определить, есть ли перекрытие между двумя кадрами, создайте новые столбцы на основе условных обозначений и объедините, используя how = 'external'

То, что я наблюдал из данных следует, что если перекрытие (end-start) в df_1 больше или равно перекрытию в df_2, то добавьте start_data_2, в противном случае оставьте как есть. Расчет зависит от этого; если это ложная предпосылка, дайте мне знать.

#create overlap columns

df_1['overlap']= df_1.end - df_1.start
df_2['overlap']= df_2.end - df_2.start

cond1 = df_1.overlap.ge(df_2.overlap)
df_1['key'] = np.where(cond1, df_2.some_data_2,'n1')
df_2['key'] = np.where(cond1, df_2.some_data_2,'n')

(pd
 .merge(df_1,df_2,
        how='outer',
        on='key',
        suffixes = ('_1','_2'))
 .drop(['key','overlap_1','overlap_2'],
       axis=1)
  )

   start_1  end_1   some_data_1 start_2 end_2   some_data_2
0   0.0     5.0        AA        0.0    5.0      AA_AA
1   10.0    17.0       BB       12.0    17.0     BB_BB
2   23.0    28.0       CC       23.0    25.0     CC_CC
3   35.0    41.0       DD       NaN     NaN      NaN
4   NaN     NaN        NaN      55.0    62.0     DD_DD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...