python - 获取 Pandas df 的子集,其中多个列与另一个 df 的值匹配
问题描述
我有两个带有多索引的数据框,如下所示:
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 中。我想做的是用值更新df1中的观察colobservation
df2 中的值更新 df1 中的观察 col,只要它匹配。
换句话说,我想做相当于基于多索引的内连接,然后observation
用 df2 中的值覆盖 df1 中的值。但是有没有一种方法可以一步完成,使用loc
/indexing?(这是一个索引问题,但如果有办法使用它来解决它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
解决方案
如果我理解正确,你可以这样做:
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
推荐阅读
- ios - 快速解析 JSON 时出现 typeMismatch 错误
- google-bigquery - bigquery中的多个array_agg
- javascript - 为什么我在获取数据表单 API 时变得不确定
- python-3.x - 此代码未在 python 文件上运行,但表示它以正确的hackerran 运行
- python - 如何获取出现在cmd上的用户名?
- gdb - 无法使用 MinGW 交叉编译 gdb
- r - 如果列超过 R Markdown 中的页面容量,如何从表中拆分行?
- javascript - 即使没有任何错误,我的 discord.js 机器人也不会回复用户消息
- python - 从矩阵中的一行更改值的问题
- javascript - 尝试读取本地文件并将其打印到控制台