如何在DataFrame匹配Name与Week时,为对应行Total添加对应Value值
问题:匹配DataFrame的Name和Week列,累加对应Value到Total列
现有两个Pandas DataFrame(df和df1),需求是:在df1中,只要Name和Week列的值与df中对应列完全匹配,就将df里对应的Value值加到df1的Total列上。
数据示例
df数据
df Name Week Value 0 Frank Week 3 8.0 1 Bob Week 3 8.0 2 Bob Week 4 8.0 3 Elizabeth Week 3 4.0 4 Mario Week 2 1.5 5 Mario Week 3 2.5 6 Michelle Week 3 8.0 7 Michelle Week 4 1.0 8 Darwin Week 1 1.0 9 Darwin Week 2 0.5 10 Darwin Week 3 11.0 11 Collins Week 1 8.0 12 Collins Week 2 6.0 13 Collins Week 3 17.0 14 Collins Week 4 7.0 15 Alexis Week 1 1.5 16 Daniel Week 3 2.0
df1数据
df1 Name Week Total 0 Frank Week 1 16 1 Frank Week 1 3 2 Frank Week 3 28 3 Frank Week 3 1 4 Frank Week 4 3 .. ... ... ... 310 Daniel Week 2 50 311 Daniel Week 3 56 312 Daniel Week 4 78 313 Kevin Week 4 162 314 Kevin Week 4 46
期望输出
df1 Name Week Total 0 Frank Week 1 16 1 Frank Week 1 3 2 Frank Week 3 36 3 Frank Week 3 9 4 Frank Week 4 3 .. ... ... ... 310 Daniel Week 2 50 311 Daniel Week 3 58 312 Daniel Week 4 78 313 Kevin Week 4 162 314 Kevin Week 4 46
解决方案
这里提供两种高效的实现方式:
方法一:利用索引映射(高效简洁)
先将df转换为以Name和Week为复合索引的Value映射,再通过索引匹配给df1的Total列累加对应值:
import pandas as pd # 创建Name+Week到Value的映射 value_lookup = df.set_index(['Name', 'Week'])['Value'] # 匹配并累加,无匹配项则加0 df1['Total'] += df1.set_index(['Name', 'Week']).index.map(value_lookup).fillna(0).values # 恢复df1的原索引(如果需要) df1.reset_index(drop=True, inplace=True)
方法二:合并DataFrame(直观易理解)
通过左合并将df的Value列匹配到df1中,再进行累加计算:
import pandas as pd # 左合并保留df1所有行,匹配Name和Week列 merged_df = df1.merge(df, on=['Name', 'Week'], how='left') # 累加Total和Value(无匹配的Value填0) merged_df['Total'] = merged_df['Total'] + merged_df['Value'].fillna(0) # 移除临时的Value列,得到最终结果 df1 = merged_df.drop(columns=['Value'])
两种方法都能实现需求,方法一适合数据量较大的场景,效率更高;方法二逻辑更直观,适合新手理解。
内容的提问来源于stack exchange,提问作者dweitman1
相关产品推荐
相关产品推荐

