如何为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
相关产品推荐
相关产品推荐

