如何按test_num和el_num匹配,将diff.value与df.value相加并更新df.value
按test_num和el_num匹配,将diff.value与df.value相加并更新df.value
原始DataFrame df
test_num el_num file_num value fail 429 4 1 0 3.36 False 430 4 1 1 3.29 False 431 4 1 2 3.29 False 432 4 1 3 3.26 False 433 4 1 4 3.28 False 434 4 1 5 3.26 False 435 4 1 6 3.27 False 436 4 1 7 3.26 False 437 4 1 8 3.26 False 438 4 1 9 3.18 False 439 4 1 10 3.24 False 440 4 1 11 3.27 False 441 4 1 12 3.32 False 429 5 2 0 3.36 False 430 5 2 1 3.29 False 431 5 2 2 3.29 False 432 5 2 3 3.26 False 433 5 2 4 3.28 False 434 5 2 5 3.26 False 435 5 2 6 3.27 False 436 5 2 7 3.26 False 437 5 2 8 3.26 False 438 5 2 9 3.18 False 439 5 2 10 3.24 False 440 5 2 11 3.27 False 441 5 2 12 3.32 False
原始DataFrame diff
value el_num test_num 198 0.43 1 5 204 0.43 2 5 210 0.46 3 5 216 0.42 4 5 222 0.41 5 5 228 0.43 6 5 234 0.46 7 5 240 0.43 8 5 246 0.44 9 5 252 0.41 10 5 258 0.19 11 5
解决方法
方法一:通过merge匹配计算
先按test_num和el_num合并两个DataFrame,计算更新后的value,再回写原df:
# 合并df与diff,保留df所有行,匹配不到diff的行暂存空值 merged = df.merge(diff, on=['test_num', 'el_num'], how='left', suffixes=('', '_diff')) # 计算新value:原value加diff的value,匹配不到则加0 merged['value'] = merged['value'] + merged['value_diff'].fillna(0) # 移除临时列,更新原df df = merged.drop(columns=['value_diff'])
方法二:用索引映射快速匹配
将diff转为以test_num和el_num为复合索引的Series,直接映射到df中计算:
# 把diff转换成复合索引的Series diff_series = diff.set_index(['test_num', 'el_num'])['value'] # 用df的复合索引匹配diff的值,匹配不到填0,再与原value相加 df['value'] += df.set_index(['test_num', 'el_num']).index.map(diff_series.get).fillna(0)
效果说明
两种方法都会让df中test_num和el_num与diff匹配的行,value加上对应diff的数值;匹配不到的行(比如df中test_num=4的所有行)value保持不变。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

