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

Я пытаюсь объединить два фрейма данных на основе нескольких столбцов. Однако одно из условий не является прямым, поскольку один столбец в одном фрейме данных существует в столбце списков в другом фрейме данных. Как показано ниже

df_a:

enter image description here

df_b:

enter image description here

Я хочу объединить оба фрейма данных на основе узла, канала, значения. Однако значение находится внутри списка в столбце trail

Я попытался создать словарь из df_a, чтобы узел и канал были ключами, но это не будет уникально, я добавил значение в качестве ключа, но тогда я не смог бы найти это значение. Любой совет для решения этой проблемы очень ценится

1 Ответ

1 голос
/ 17 апреля 2020

Обновление за комментарий @JonClements, если не всегда первый элемент попробуйте:

(df_b.assign(value=df_b['trail'].str.split(','))
     .explode('value')
     .merge(df_a, on=['node', 'channel', 'value']))

Попробуйте, если значение всегда является первым элементом в следе:

import pandas as pd

df_a = pd.DataFrame({'node':['a']*4, 
                     'channel':[1,2,1,2],   
                     'wavelength':[555, 666, 555, 666], 
                     'value':['1-111-5', '1-222-6', '1-111-7', '1-222-8']})

df_b = pd.DataFrame({'node':['a']*4,
                     'channel':[1,2,1,2],
                     'trail':['1-111-5,1-a-5,2-r-3', 
                             '1-222-6,2-4-5,1-d-3', 
                             '1-111-7,1-a-2,1-f-t', 
                             '1-222-8,1-e-4'],
                    'power':[10,12,13,12]})

df_out = (df_b.assign(value=df_b['trail'].str.split(',').str[0])
              .merge(df_a, on=['node', 'channel', 'value']))
print(df_out)

Вывод:

  node  channel                trail  power    value  wavelength
0    a        1  1-111-5,1-a-5,2-r-3     10  1-111-5         555
1    a        2  1-222-6,2-4-5,1-d-3     12  1-222-6         666
2    a        1  1-111-7,1-a-2,1-f-t     13  1-111-7         555
3    a        2        1-222-8,1-e-4     12  1-222-8         666
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...