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

如何为df1添加基于df2多列lookup值求和的cost、value、target列?

解决方案

这里有两种实用方法可以实现将df1中item1至item9对应df2的cost、value、target字段求和后添加到df1的需求:

方法一:向量化索引(高效适合大数据)

这种方法利用Pandas的向量化操作直接提取对应值并求和,性能最优,适合处理大规模数据集:

# 提取df1中所有item开头的列
item_cols = df1.filter(like='item').columns

# 批量计算cost、value、target的总和
# 计算cost总和
cost_values = df2.loc[df1[item_cols].values.flatten(), 'cost'].values.reshape(df1.shape[0], len(item_cols))
df1['cost'] = cost_values.sum(axis=1)

# 计算value总和
value_values = df2.loc[df1[item_cols].values.flatten(), 'value'].values.reshape(df1.shape[0], len(item_cols))
df1['value'] = value_values.sum(axis=1)

# 计算target总和
target_values = df2.loc[df1[item_cols].values.flatten(), 'target'].values.reshape(df1.shape[0], len(item_cols))
df1['target'] = target_values.sum(axis=1)

方法二:重塑DataFrame(直观易理解)

通过将df1的宽表转成窄表,与df2合并后分组求和,逻辑更清晰,适合新手理解:

# 提取item列
item_cols = df1.filter(like='item').columns

# 将df1重塑为长格式,保留唯一标识列(id、guid、name)
df1_melted = df1.melt(
    id_vars=['id', 'guid', 'name'],
    value_vars=item_cols,
    value_name='item_lookup'
)

# 与df2合并,获取每个item对应的cost、value、target
merged_df = df1_melted.merge(df2, on='item_lookup', how='left')

# 按用户标识分组,求和对应字段
summed_df = merged_df.groupby(['id', 'guid', 'name'])[['cost', 'value', 'target']].sum().reset_index()

# 将求和结果合并回原df1
df1 = df1.merge(summed_df, on=['id', 'guid', 'name'], how='left')

注意事项

  • 如果df1中存在df2没有的item值,how='left'会保留这些行,对应求和字段会出现NaN,可根据需求用fillna(0)处理
  • 方法一的性能远优于方法二,当数据集行数超过10万时,优先选择方法一

内容的提问来源于stack exchange,提问作者Sean Sailer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:40:54