You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多DataFrame匹配color列后按条件累加列值问题求助

问题需求

我有两个DataFrame a 和 b,需要实现以下操作:

  • 筛选出两DataFrame中color列的共同值
  • 将a的scalar_y列值累加到b的y列,但仅当b中y列的现有值大于0时执行累加
  • 将a的scalar_z列值累加到b的z列,但仅当b中z列的现有值大于0时执行累加

数据定义代码

import pandas as pd
import numpy as np

# DataFrame a
dict1 = {'color':['purple','yellow','red','green','blue', 'violet','black'], 
         'scalar_y':[1,2,0,5,7,9,10], 
         'scalar_z':[2,4,6,8,10,12,10]}
a = pd.DataFrame(dict1)

# DataFrame b
dict2 = {'color':['purple','yellow','yellow','green','blue', 'violet','violet'], 
         'x':['ducks','geese','moose','bear','acorn','seagull','worm'],
         'y':[10,20,0,50,70,90,100], 
         'z':[20,40,60,80,100,120,0]}
b = pd.DataFrame(dict2)

现有尝试代码

empty = pd.DataFrame()
for color in a.color:
    new_df = b.loc[b['color'].str.contains(color)]
    new_df['y'] = new_df['y'].apply(lambda x: '0' if x==0 else new_df['y'] = new_df['y'].add(a['scalar_y'], axis=0))
    empty = pd.concat([empty,new_df])
    #print(new_df)
empty

解决方案

直接用merge关联两个DataFrame的color列,结合条件判断完成累加,最终得到符合要求的结果:

# 提取a中用于累加的映射数据
a_mapping = a[['color', 'scalar_y', 'scalar_z']]

# 合并b和a的映射数据,保留b的所有行并匹配对应color的累加值
merged = b.merge(a_mapping, on='color', how='left')

# 对y列执行条件累加:仅当原y值>0时,加上对应的scalar_y
merged['y'] = np.where(merged['y'] > 0, merged['y'] + merged['scalar_y'], merged['y'])

# 对z列执行条件累加:仅当原z值>0时,加上对应的scalar_z
merged['z'] = np.where(merged['z'] > 0, merged['z'] + merged['scalar_z'], merged['z'])

# 移除合并产生的临时列,得到最终结果
result = merged.drop(['scalar_y', 'scalar_z'], axis=1)

print(result)

代码说明

  1. 映射表提取:从a中取出color和需要累加的列,作为后续关联的匹配依据
  2. 数据合并:使用左连接(left merge)确保保留b的所有行,同时匹配a中对应color的累加值
  3. 条件累加:通过np.where实现向量化条件判断,避免循环,高效完成累加逻辑
  4. 结果清理:移除合并时新增的临时列,保持结果结构与原b一致

该方法利用pandas的向量化操作特性,比循环实现更高效且逻辑清晰,能避免循环带来的索引错误和性能问题。

内容的提问来源于stack exchange,提问作者Peter Bright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:53:16