获取多个列与另一个d中的值匹配的数据集

2024-06-28 19:02:20 发布

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

我有两个多索引的数据帧,如下所示:

df1

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'): np.nan,
  ('bar', '2017-04-27'): 'white',
  ('foo', '2017-05-16'): np.nan,
  ('foo', '2017-04-25'): 'red',
  ('zip', '2017-08-16'): 'red'}})

df2

pd.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'},
 'obs': {('00', '08'): '02',
  ('01', '08'): '02',
  ('01', '08'): '02',
  ('00', '08'): '02',
  ('03', '08'): '02',
  ('06', '08'): '02',
  ('00', '08'): '02',
  ('00', '08'): '02',
  ('00', '08'): '02',
  ('02', '08'): '02'}})

这两个索引的大小不一样,而且值并不总是重叠的,但是在df1中找到的每个索引对都在df2中。我想做的是用df2中的observation值更新df1中的observation列,只要它匹配。你知道吗

换句话说,我想基于multi索引做一个等价的内部连接,然后用df2中的值覆盖df1中observation中的值。但是,有没有一种方法可以一步完成,使用loc/索引?(这是一个索引问题,但是如果有一种方法可以用reset_index()来解决它,那也没问题。)

期望输出:

        obs
00  04  30
    08  02
    09  16
    10  26
    16  26
01  01  30
    07  16
02  08  02
03  13  26
07  15  26

Tags: 方法dataframefoonpbarrednanzip
1条回答
网友
1楼 · 发布于 2024-06-28 19:02:20

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

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

相关问题 更多 >