根据不同列的部分字符串匹配在新数据框列中创建标签

时间:2018-10-10 15:47:51

标签: python python-3.x pandas

首先,我查看了许多SO线程,但似乎没有一个能正常工作。 Creating a new column based on if-elif-else condition似乎与我要尝试的最接近。

在我的df中,我有一列包含产品名称。我正在尝试创建一个函数,该函数在该列的每一行中查找部分字符串匹配项,并根据该匹配项为新df列中的每一行创建一个标签。我想使用一个函数,因为我需要匹配大约5或6种模式。

我正在使用contains()函数查找部分产品标题匹配。这将返回一个布尔值,然后在函数中使用else / if进行检查:

def label_sub_cat():
    if data['product'].str.contains('Proceedings', case=False) is True:
        return 'Proceedings'
    elif data['product'].str.contains('DVD', case=False) is True:
        return 'DVD'
    else:
        return 'Other'

data['product_sub_cat'] = data.apply(label_sub_cat(), axis=1)

我一直收到以下错误:

AttributeError: 'DataFrame' object has no attribute 'other'

2 个答案:

答案 0 :(得分:1)

df.apply()中的

函数应该应用于df的每一行,而不是整个df。

In [37]: df = pd.DataFrame({'product':['aProcedings', 'aDVD','vcd']})
In [38]: def label_sub_cat(row):
...:     if 'Procedings' in row['product']:
...:         return 'Proceedings'
...:     elif 'DVD' in row['product']:
...:         return 'DVD'
...:     else:
...:         return 'Other'
...:
...:

In [39]: df['product_sub_cat'] = df.apply(label_sub_cat, axis=1)

In [40]: df
Out[40]:
       product product_sub_cat
0  aProcedings     Proceedings
1         aDVD             DVD
2          vcd           Other

答案 1 :(得分:1)

只需更改功能

def label_sub_cat(row):
    if row.product.str.contains('Proceedings', case=False) is True:
        return 'Proceedings'
    elif row.product.str.contains('DVD', case=False) is True:
        return 'DVD'
    else:
        return 'Other'

data['product_sub_cat'] = data.apply(label_sub_cat, axis=1)