【问题标题】:Pandas Inner Join with LambdaPandas 内连接与 Lambda
【发布时间】:2018-02-12 19:29:46
【问题描述】:

我有以下两个框架:

第一帧:

            id
0  111-111-111
1  111-111-222
2  222-222-222
3  333-333-333

帧2:

     data       id
0    ones  111-111
1  threes  333-333

而且,我有一个将frame1.id 映射到frame2.id 的lambda 函数:

id_map = lambda x: x[:7]

我的目标是在这两个表之间执行内部连接,但让 id 通过 lambda。所以输出是:

            id    data
0  111-111-111    ones
1  111-111-222    ones
2  333-333-333  threes

我想出了一个相当不优雅的解决方案,几乎做了我想做的事情,但是当内部连接删除行时它会搞砸:

# 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

有没有一个优雅的解决方案?

【问题讨论】:

  • frame1['id'] = frame1['id'].str.slice(7)
  • @WillemVanOnsem 这实际上就是我对frame1['id'] = frame1['id'].apply(id_map) 所做的事情。但这并不能解决问题。
  • @AaronNBrock:但它更优雅,更高效。
  • @WillemVanOnsem 嗯,很高兴知道!然而,在实际用例中,lambda 比这更混乱,所以它不起作用。但是感谢您的提示!

标签: python pandas join lambda inner-join


【解决方案1】:

可以使用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)

输出:

            id    data
0  111-111-111    ones
1  111-111-222    ones
2  333-333-333  threes

【讨论】:

  • 我刚刚想出了这个,它似乎确实有效。如果有一个 .merge(frame2, right_on=lambda x: x[:7]) 会很好,其中 x 是任何 left_on 设置为
  • @AaronN.Brock 是的,根据文档,on 接受标签或列表而不是函数:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2017-02-03
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
相关资源
最近更新 更多