如何基于共同Category将df2的Value retained与df1的Price相乘并新增列至df1
问题:根据Category匹配计算并添加新列至DataFrame
我有两个DataFrame:
import pandas as pd data1 = {'Item': ['A', 'B', 'C', 'N'], 'Price': [1, 2, 3, 10], 'Category': ['X', 'Y', 'X', 'Z'], 'County': ['K', 'L', 'L', 'K']} df1 = pd.DataFrame(data1) data2 = {'Category': ['X', 'Y', 'Z'], 'Value retained': [0.1, 0.2, 0.8]} df2 = pd.DataFrame(data2)
需求: 根据对应的Category将'Value retained'与'Price'相乘,并将结果作为新列添加至df1中。
我尝试过以下方法,但都没达到预期:
第一种尝试:
df3 = df1 for cat, VR in df2['Category', 'Value retained']: if cat in df1.columns: df3[cat] = df1['Price'] * VR
第二种尝试:
df3 = df1['Price'] * df2.set_index('Category')['Value retained'] df3
注:我的真实数据包含25万+条记录、32个不同的Category,每个Category对应不同的'Value retained'值。
解决方案
针对大数据量场景,推荐以下两种高效的向量化方法,避免Python循环的性能损耗:
方法1:通过merge关联后计算
逻辑直观,适合需要保留Value retained列的场景:
# 按Category合并两个DataFrame,保留df1所有行 merged_df = df1.merge(df2, on='Category', how='left') # 计算新列 merged_df['Calculated Value'] = merged_df['Price'] * merged_df['Value retained'] # 可选:若不需要保留'Value retained'列,可删除 # merged_df = merged_df.drop('Value retained', axis=1)
方法2:使用map匹配取值(性能更优)
将df2转为字典,利用map快速匹配Category对应的取值,计算效率更高:
# 转换为Category到Value retained的映射字典 vr_map = df2.set_index('Category')['Value retained'].to_dict() # 匹配并计算新列 df1['Calculated Value'] = df1['Price'] * df1['Category'].map(vr_map)
内容的提问来源于stack exchange,提问作者Rafael Laurenti
相关产品推荐
相关产品推荐

