多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)
代码说明
- 映射表提取:从
a中取出color和需要累加的列,作为后续关联的匹配依据 - 数据合并:使用左连接(
left merge)确保保留b的所有行,同时匹配a中对应color的累加值 - 条件累加:通过
np.where实现向量化条件判断,避免循环,高效完成累加逻辑 - 结果清理:移除合并时新增的临时列,保持结果结构与原
b一致
该方法利用pandas的向量化操作特性,比循环实现更高效且逻辑清晰,能避免循环带来的索引错误和性能问题。
内容的提问来源于stack exchange,提问作者Peter Bright
相关产品推荐
相关产品推荐

