我有一个数据帧data
,我取了g2_data
的一个子集来执行一些操作。如何使用其中一列的值作为引用,将原始数据框中的值替换为子集中的值?
data
的列结构保留在g2_data
子集中,如下所示。
data:
idx group x1 y1
0 27 1 0.0 0.0
1 28 1 0.0 0.0
2 29 1 0.0 0.0
3 73 1 0.0 0.0
4 74 1 0.0 0.0
... ... ... ...
14612 14674 8 0.0 0.0
14613 14697 8 0.0 0.0
14614 14698 8 0.0 0.0
14615 14721 8 0.0 0.0
14616 14722 8 0.0 0.0
[14617 rows x 4 columns]
g2_data:
idx group x1 y1
1125 1227 2 115.0 0.0
1126 1228 2 0.0 220.0
1127 1260 2 0.0 0.0
1128 1294 2 0.0 0.0
1129 1295 2 0.0 0.0
... ... ... ...
3269 3277 2 0.0 0.0
3270 3308 2 0.0 0.0
3271 3309 2 0.0 0.0
3272 3342 2 0.0 0.0
3273 3343 2 0.0 0.0
[2149 rows x 4 columns]
使用来自另一个数据框的索引替换数据框中的行,使用行索引值可以回答这个问题,但我想使用idx
列的值,以防我需要稍后在子集中重置索引(即从0开始,而不是使用原始数据框的索引值)。重要的是要注意idx
列中的值都是唯一的,因为它们与每个观测值的信息有关。
这可能不是最优的,但是您可以将g2_data
转换为字典,然后基于idx
映射其他列,将更新过滤到g2_data子集中的那些id。
g2_data_dict = g2_data.set_index('idx').to_dict()
g2_data_ids = g2_data['idx'].to_list()
for k in g2_data_dict.keys():
data.loc[df['idx'].isin(g2_data_ids), k] = data['idx'].map(g2_data_dict[k])
使用combine_first
:
out = g2_data.set_index('idx').combine_first(data.set_index('idx')).reset_index()