Python 复杂的列表列到列字符串匹配和派生另一列

Python 复杂的列表列到列字符串匹配和派生另一列,python,pandas,dataframe,feature-extraction,feature-engineering,Python,Pandas,Dataframe,Feature Extraction,Feature Engineering,数据帧: df1: ind_lst [agriculture_dairy, analytics] [architecture_planning, advertising_pr_events, analytics] df2: ind score advertising_pr_events 3.672947168 agriculture_dairy 3.368266582 airlines_aviation_aerospace 3.60798955 analytics 3.677

数据帧:

df1:
ind_lst
[agriculture_dairy, analytics]
[architecture_planning, advertising_pr_events, analytics]

df2:
ind    score
advertising_pr_events   3.672947168
agriculture_dairy   3.368266582
airlines_aviation_aerospace 3.60798955
analytics   3.67752552
architecture_planning   3.853236675
我有两个数据帧,如上所示

df2的列ind为字符串类型,具有行业名称。df2.score对每个行业都有一个唯一的分数

df1的ind_lst列是由df2.ind独特元素的不同组合形成的行业名称列表

我想在df1avg_score中创建一列,以便最终输出如下:

df1第1行中的平均得分是df2中对应于农业乳品分析的平均得分

df1第2行中的平均分数是df2中与建筑规划、广告、公关活动、分析相对应的平均分数。

如何在python中实现这一点? 我试过这个:

avg=[]
avgs=[]
for i in df1.ind_lst:
    for j in i:
        a= df2[df2['ind'] == j].index
        avg.append(df2.loc[a]['score'])
    avgs.append(mean(avg))
    

df1['avg_score']= avgs
代码不太好用。我得到一个空列表作为输出


注意:我对数据帧进行了采样&只共享了问题陈述的一个子集。实际数据帧df1有90k个条目,df2有860行。

选项1:从df2创建索引和分数的映射。使用列表理解将分数映射到行业并计算平均值

mapper = df2.set_index('ind')['score'].to_dict()
df1['avg_score'] = df1['ind_lst'].apply(lambda x: np.mean([mapper[i] for i in x]))

    ind_lst                                             avg_score
0   [agriculture_dairy, analytics]                      3.522896
1   [architecture_planning, advertising_pr_events,...   3.734570
选项2:用于取消列表、分组索引和应用平均值

df1['avg_score'] = df1['ind_lst'].explode().map(mapper).groupby(level = 0).mean()

与使用映射器和列表理解不同,您可以将列表用作df2的索引,如下所示

df1["average_score"] = df1["ind_lst"].apply(lambda lst: df2.loc[lst, "score"].mean())
df1["average_score"] = df1["ind_lst"].apply(lambda lst: df2.loc[lst, "score"].mean())