【问题标题】:complicated list column to column string matching and deriving another column复杂的列表列到列字符串匹配并派生另一列
【发布时间】:2021-03-11 18:24:30
【问题描述】:

数据框:

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

如上所示,我有 2 个数据框。

df2 的

ind 是字符串类型且具有行业名称。 df2.score 对每个行业都有一个独特的分数。

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

我想在 df1 avg_score 中创建一列,最终输出如下:

df1 的 row1 中的 avg_score 是 df2 中对应于 Agriculture_dairy, analytics 的得分的平均值

df1 的 row2 中的 avg_score 是 df2 中对应于 architecture_planning、advertising_pr_events、analytics 的分数的平均值。

df1
ind_lst    avg_score
[agriculture_dairy, analytics]    3.522896051
[architecture_planning, advertising_pr_events, analytics]    3.734569787666667

如何在 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 行。

【问题讨论】:

    标签: python pandas dataframe feature-extraction feature-engineering


    【解决方案1】:

    选项 1:从 df2 创建一个 ind 和 score 映射。使用列表推导将分数映射到行业并计算平均值。

    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:使用DataFrame.explode 取消嵌套列表、分组索引并应用均值

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

    【讨论】:

      【解决方案2】:

      您可以像这样使用列表作为 df2 的索引,而不是像 Vaishali 那样使用映射器和列表推导式。

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

      【讨论】:

        猜你喜欢
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        相关资源
        最近更新 更多