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())