我正在尝试基于多个列连接两个数据框。但是,条件之一不是直接的,因为一个数据帧中的一列存在于另一数据帧中的列表列中。如下
df_a:
df_b:
我想基于节点,通道,值来连接两个数据帧。但是,值在列尾的列表中
我试图从df_a创建一个字典,以将节点和通道作为键,但是那不是唯一的,我将该值添加为键,但是后来我找不到该值。解决此问题的任何技巧都将受到赞赏
答案 0 :(得分:1)
如果不是总是第一个元素尝试,则通过@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