首页 > 解决方案 > 对另一列中的一列中的字符串进行分类 - python

问题描述

我有 3 列的数据框。A 列包含许多产品的标题,B 列包含所有品牌名称,C 列包含所有产品的型号/系列。A 列有 +2000 行,B 列有大约 50 行,C 列有大约 200 行。我想创建一个新的 D 列,用于分类 A 列中的标题是否包括品牌、型号或通用

我的数据框示例和 D 列中的所需结果

Column A        Column B   Column C    Column D
Running shoes   Nike       Airmax 2    Generic
Nike airmax 2   Adidas     All stars   Model/series
Airmax 2        Converse   Ultraboost  Model/series
Nike Shoes      Puma       Questar     Brand

如果 A 列中的一行包含品牌和型号,我希望 D 列将该行归类为型号/系列。A 列中无法与品牌或型号/系列匹配的所有行都应归类为通用。

我开始尝试这个:

df['Column D'] = df.apply(lambda x: x.Column_b in x.Column_a, axis=1)

在这里我得到一个错误,因为 B 列的行数比 A 列少得多。

然后我想知道循环是否是正确的方法,或者我是否需要做一个正则表达式。

任何有关如何完成获得所需 D 列的帮助,将不胜感激。

标签: pythonpandasdataframe

解决方案


使用,Series.str.contains创建一个布尔掩码 m1,其中此掩码中的真值对应于Column A包含来自的值的条件,Column B以类似的方式创建布尔掩码 m2,然后用于np.select根据基于m1和的条件从选项中选择值m2

m1 = df['Column A'].str.contains('|'.join(df['Column B']), case=False)
m2 = df['Column A'].str.contains('|'.join(df['Column C']), case=False)

df['Column D'] = np.select(
    [m1 & m2, m1, m2], ['Model/series', 'Brand', 'Model/series'], 'Generic')

# print(df)
        Column A  Column B    Column C      Column D
0  Running shoes      Nike    Airmax 2       Generic
1  Nike airmax 2    Adidas   All stars  Model/series
2       Airmax 2  Converse  Ultraboost  Model/series
3     Nike Shoes      Puma     Questar         Brand

推荐阅读