首先,我查看了许多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'
答案 0 :(得分:1)
函数应该应用于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)