如何为含物品列表列的DataFrame新增匹配另一DataFrame的均值列?
实现方案
先看示例数据
先构造符合你描述的示例DataFrame,方便理解操作逻辑:
import pandas as pd # df2:item为索引,存储物品对应数值 df2 = pd.DataFrame( {'value': [234, 2, 3]}, index=['items1', 'items4', 'items2500'] ) # df1:包含物品列表的列 df1 = pd.DataFrame({ 'item_list': [["items1","items4","items2500"], ["items1", "items4"]] })
情况1:df2的item列是索引
直接用apply遍历每行的物品列表,通过df2.loc匹配取值后计算均值:
df1['avg_value'] = df1['item_list'].apply(lambda x: df2.loc[x, 'value'].mean())
运行后df1会新增avg_value列,第一行值为(234+2+3)/3≈79.67,第二行是(234+2)/2=118。
情况2:df2的item列是普通列
如果item是普通列,先临时将其设为索引再操作更高效:
# 假设df2的item是普通列 df2 = pd.DataFrame({ 'item': ['items1', 'items4', 'items2500'], 'value': [234, 2, 3] }) # 临时转索引后计算均值 df1['avg_value'] = df1['item_list'].apply( lambda x: df2.set_index('item').loc[x, 'value'].mean() )
处理列表中存在不存在的物品
如果你的物品列表里有df2中没有的条目,上面的代码会返回NaN。要是想忽略这些不存在的物品,只计算存在的均值,可以这么写:
df1['avg_value'] = df1['item_list'].apply( lambda x: df2.loc[df2.index.isin(x), 'value'].mean() if x else 0 )
这里用df2.index.isin(x)过滤出存在的物品,同时判断列表为空时返回0(你可以根据需求调整这个默认值)。
内容的提问来源于stack exchange,提问作者angelo vozzella
相关产品推荐
相关产品推荐

