在一个键上左联接,在另一列中左联接一个列值

2024-04-27 03:17:45 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有2个panda df,我想让左A在2个条件下连接B,1)A.id=B.id 2)B.x\u集中的A.x。有人能帮我吗?地址:

答:

id  x
1   a
2   b
3   c

第二:

id  x_set   detail
1   a,b,c   x
1   d       y
2   a,c     z
2   d       m
2   b       n
3   a       i
3   b,c     j

最后一张表应该是这样的:

id  x   detail
1   a   x
2   b   n
3   c   j

Tags: iddf地址条件pandadetailset
1条回答
网友
1楼 · 发布于 2024-04-27 03:17:45

如果使用pandas==0.25,您可以:

  1. 将值转换为列表
  2. 将列表分解成新行
  3. 使用pd.merge
B['x_set'] = B['x_set'].apply(lambda x: x.split(','))
B = B.explode('x_set')

A.merge(B, left_on=['id','x'], right_on=['id','x_set'])

Out[11]: 
   id  x x_set detail
0   1  a     a      x
1   2  b     b      n
2   3  c     c      j

如果pandas<0.25

  1. 将值转换为列表
  2. 获取x的展平列表
  3. 使用新列表创建新的数据帧
  4. 使用pd.Series.repeat传递iddetail
  5. 与A合并(我们可以在这里使用相同的键)
B['x_set'] = B['x_set'].apply(lambda x: x.split(','))

len_set = B['x_set'].apply(len).values

values = B['x_set'].values.flatten().tolist()
flat_results = [item for sublist in values for item in sublist]

new_B = pd.DataFrame(flat_results, columns=['x'])

new_B['id'] = B['id'].repeat(len_set).values
new_B['detail'] = B['detail'].repeat(len_set).values

A.merge(new_B, on=['id','x'])
Out[32]: 
   id  x detail
0   1  a      x
1   2  b      n
2   3  c      j

相关问题 更多 >