为了账号安全,请及时绑定邮箱和手机立即绑定

获取 Pandas df 的子集,其中多列匹配来自另一个 df 的值

获取 Pandas df 的子集,其中多列匹配来自另一个 df 的值

慕桂英4014372 2021-10-12 16:10:22
我有两个带有多索引的数据框,如下所示:df1pd.DataFrame({'observation': {('foo', '2017-04-16'): 'green',  ('bar', '2017-04-25'): 'red',  ('zap', '2017-04-16'): 'red',  ('zip', '2017-04-25'): 'blue',  ('zip', '2017-04-16'): 'white'}, 'observation': {('zap', '2017-04-16'): np.nan,  ('bar', '2017-04-27'): 'white',  ('foo', '2017-05-16'): np.nan,  ('foo', '2017-04-25'): 'red',  ('zip', '2017-08-16'): 'red'}})df2pd.DataFrame({'foo': {('00', '08'): '0.0',  ('01', '08'): '0.0',  ('01', '08'): '0.0',  ('00', '08'): '1.0',  ('03', '08'): '1.0',  ('06', '08'): '0.0',  ('00', '08'): '1.0',  ('00', '08'): '1.0',  ('00', '08'): '0.0',  ('02', '08'): '0.0'}, 'client_id': {('00', '08'): '1.0',  ('01', '08'): '1.0',  ('01', '08'): '1.0',  ('00', '08'): '1.0',  ('03', '08'): '1.0',  ('06', '08'): '1.0',  ('00', '08'): '1.0',  ('00', '08'): '1.0',  ('00', '08'): '1.0',  ('02', '08'): '1.0'}, 'execution_date': {('00', '08'): '2019-01-09',  ('01', '08'): '2019-01-09',  ('01', '08'): '2019-01-09',  ('00', '08'): '2019-01-09',  ('03', '08'): '2019-01-09',  ('06', '08'): '2019-01-09',  ('00', '08'): '2019-01-09',  ('00', '08'): '2019-01-09',  ('00', '08'): '2019-01-09',  ('02', '08'): '2019-01-09'}, 'del': {('00', '08'): '0.0',  ('01', '08'): '0.0',  ('01', '08'): '0.0',  ('00', '08'): '0.0',  ('03', '08'): '0.0',  ('06', '08'): '0.0',  ('00', '08'): '0.0',  ('00', '08'): '0.0',  ('00', '08'): '0.0',  ('02', '08'): '0.0'}, 'act': {('00', '08'): '11',  ('01', '08'): '03',  ('01', '08'): '06',  ('00', '08'): '07',  ('03', '08'): '07',  ('06', '08'): '11',  ('00', '08'): '28',  ('00', '08'): '08',  ('00', '08'): '14',  ('02', '08'): '26'},两者的大小不一样,值也不总是重叠,但在 df1 中找到的每个索引对都在 df2 中。我想要做的是使用observationdf2 中的值更新 df1 中的观察 col ,无论它在哪里匹配。换句话说,我想做一个基于多索引的内部连接,然后observation用 df2 中的值覆盖df1 中的值。但是有没有一种方法可以一步做到这一点,使用loc/indexing?(这是一个索引问题,但如果有办法解决它reset_index(),那也很好。)期望的输出:        obs00  04  30    08  02    09  16    10  26    16  2601  01  30    07  1602  08  0203  13  2607  15  26
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如果我理解正确,你可以这样做:


df2 = pd.DataFrame({'observation': {('foo', '2017-04-16'): 'green',

  ('bar', '2017-04-25'): 'red',

  ('zap', '2017-04-16'): 'red',

  ('zip', '2017-04-25'): 'blue',

  ('zip', '2017-04-16'): 'white'},

 'observation': {('zap', '2017-04-16'): 'yellow',

  ('bar', '2017-04-27'): 'white',

  ('foo', '2017-05-16'): 'black',

  ('foo', '2017-04-25'): 'red',

  ('zip', '2017-08-16'): 'red'}})


df['observation'] = df.index.map(dict(zip(df2.index, df2.observation)))

输出


               observation

bar 2017-04-27       white

foo 2017-04-25         red

    2017-05-16       black

zap 2017-04-16      yellow

zip 2017-08-16         red


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信