熊猫内部与Lambda加入

Aar*_*ock 1 python lambda join inner-join pandas

我有以下两个框架:

框架1:

            id
0  111-111-111
1  111-111-222
2  222-222-222
3  333-333-333
Run Code Online (Sandbox Code Playgroud)

框架2:

     data       id
0    ones  111-111
1  threes  333-333
Run Code Online (Sandbox Code Playgroud)

而且,我有一个lambda函数将映射frame1.idframe2.id

id_map = lambda x: x[:7]
Run Code Online (Sandbox Code Playgroud)

我的目标是在这两个表之间执行内部联接,但要让ID通过lambda。这样的输出是:

            id    data
0  111-111-111    ones
1  111-111-222    ones
2  333-333-333  threes
Run Code Online (Sandbox Code Playgroud)

我想出了一个非常优雅的解决方案,几乎可以完成我想做的事情,但是当内部联接删除行时,它就变得混乱了:

# Save a copy the original ids of frame1
frame1_ids = frame1['id'].copy()
# Apply the id change to frame1
frame1['id'] = frame1['id'].apply(id_map)
# Merge
frame1 = frame1.merge(frame2, how='inner', on='id')
# Set the ids back to what they originally were
frame1['id'] = frame1_ids
Run Code Online (Sandbox Code Playgroud)

是否有一个优雅的解决方案?

Sco*_*ton 5

assign用于创建虚拟id列(newid)进行连接,如下所示:

frame1.assign(newid=frame1['id'].str[:7])
      .merge(frame2, left_on='newid', right_on='id', suffixes=('','_y'))
      .drop(['id_y','newid'], axis=1)
Run Code Online (Sandbox Code Playgroud)

输出:

            id    data
0  111-111-111    ones
1  111-111-222    ones
2  333-333-333  threes
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚想出这个&它似乎确实有效。如果有一个 `.merge(frame2, right_on=lambda x: x[:7])` 就好了,其中 `x` 是 `left_on` 设置的值 (2认同)