首页 > 解决方案 > 根据来自不同数据帧的另一列将值更新到当前数据帧中的新列

问题描述

我的数据框中有一列充满了消息,并希望根据该消息中存在的子字符串对它们进行分类。好吧,必须在消息中搜索的那些子字符串将从不同的数据框(我们称之为主数据框)中获取,并且我的主数据框是动态的,并且基于主列表中的列表,我必须在我的主数据框列中进行分类

注意:无论大写还是小写字母,这都必须有效

df1 表如下所示:

           Messages
0         Firewall_Error
1         Firewall_Error_1
2         Firewall_Error_2
3         Firewall_Error_3
4        Wifihealth_1_Info
              ...         
109       Firewall_Error_1
110       Firewall_Error_2
111       Firewall_Error_3
112      Wifihealth_1_Info
113    Wifihealth_2_Failed

Master_df 看起来像:

    Strings Category
0   error   Error
1   info    Information
2   failed  Warning

因此,如果在 df1 的 Messages 列中找到 Master_df['Strings'][0] 子字符串,则将 df1[category] ​​中的该行映射为 Master_df['Category'][0] 等等。

预期输出:

df1 必须看起来像:

           Messages           category
0         Firewall_Error      Error
1         Firewall_Error_1    Error
2         Firewall_Error_2    Error
3         Firewall_Error_3    Error
4        Wifihealth_1_Info    Information
              ...         
109       Firewall_Error_1    Error
110       Firewall_Error_2    Error
111       Firewall_Error_3    Error
112      Wifihealth_1_Info    Information
113    Wifihealth_2_Failed    warning

代码尝试:

for i in range(0,len(Master_df['Strings'])):
    df1['Category'] = pd.np.where(df1.Messages.str.contains(Master_df['Strings'][i]), Master_df['Category'][i]))

标签: pythonpandasdataframe

解决方案


首先用于Series.str.lower 小写,然后Series.str.extract通过连接Strings转换index为可能的映射Series.map到新列:

#if need also convert Strings to lowercases
s = Master_df.set_index('Strings')['Category'].rename(index=str.lower)
pat = f'({"|".join(s.index)})'
df1['Category'] = df1['Messages'].str.lower().str.extract(pat, expand=False).map(s)
print (df1)
                Messages     Category
0         Firewall_Error        Error
1       Firewall_Error_1        Error
2       Firewall_Error_2        Error
3       Firewall_Error_3        Error
4      Wifihealth_1_Info  Information
109     Firewall_Error_1        Error
110     Firewall_Error_2        Error
111     Firewall_Error_3        Error
112    Wifihealth_1_Info  Information
113  Wifihealth_2_Failed      Warning

推荐阅读