Pandas объединить два df, где df1.column = или между df2.column1 и df2.column2 - PullRequest
0 голосов
/ 02 апреля 2020

Кажется, я нигде не могу найти этот пример. Не удается определить, нужно ли мне использовать индексы, логическую маску или возможно ли прямое слияние. Я пробовал варианты .isin и .between каждая, но безуспешно.

Сценарий:

  • Два кадра данных без общего индекса :

    df1 = pd.DataFrame({'printId': ['x','y', 'z', 'a'],'locCode': [0.9, 1.5, 4.0, 7.8]})
    df2 = pd.DataFrame({'assetId': ['1','1a', '2', '2a', '3', '4'], 'locStart': [0.9, 0.9, 1, 1, 4, 8], 'locEnd': [0.9, 0.9, 3, 3, 5, 13]})
    

df1:

enter image description here

df2:

enter image description here

Нужно это:

df3 = pd.DataFrame({'printId': ['x','x', 'y', 'y', 'z', 'a', 'NaN'], 'locCode': ['0.9', '0.9', '1.5', '1.5', '4.0', '7.8', 'NaN'], 'assetID': ['1', '1a', '2', '2a', '3', 'NaN', '4'], 'locStart': ['0.9', '0.9', '1.0', '1.0', '4.0', 'NaN', '8.0'], 'locEnd':['0.9', '0.9', '3.0', '3.0', '4.0', 'NaN', '13.0']})

df3

enter image description here

Как специалисты решают эту проблему?

РЕДАКТИРОВАНИЕ: Оригинальный ответ не сработал после более тщательного изучения.

  • Если df2 дублирует locStart/End записей, но уникален assetID (строки 0, 1 и строки 2 и 3), df1 не будет объединяться.

1 Ответ

2 голосов
/ 03 апреля 2020

Попробуйте это.

import pandas as pd
import numpy as np
df1 = pd.DataFrame({'printId': ['01','1A', '2B', '3C'],'locCode': [0.9, 1.5, 4.0, 7.8], 'a1': ['foo', 'foo', 'foo', 'foo']})
df2 = pd.DataFrame({'assetId': ['oo', 'aa', 'zz', 'xx'], 'locCodeStart': [0, 1, 4, 8], 'locCodeEnd': [0.4, 3, 5, 13]})

df1['assetId'] = np.nan
for ind, row in df1.iterrows():
    loc_code = row['locCode']
    temp = (df2['locCodeStart'] <= loc_code) & (loc_code < df2['locCodeEnd'])
    df2_index = temp[temp == True].index
    if len(df2_index) == 1:
        df1['assetId'].loc[ind] = df2['assetId'].loc[df2_index[0]]

pd.merge(df1, df2, how = 'outer')
...