以下代码可用于对单个邮件进行分类
total_frame['dummy_message'][total_frame['Message'].str.contains(['rrc'],case = False)] = 'msg1'
index Message
0 rrc
1 as1
2 as1
3 a2
4 as1
5 a2
但是,如果我想对“消息”列中的所有消息进行分类,我想使用类似的东西
total_frame['dummy_message'[total_frame['Message'].str.contains(['rrc','as1','as2','a2'],case = False)] = 'msg1','msg2','msg3','msg4'
这不起作用,因为str.contains不接受列表。 输出应该看起来像这样
index Message dummy message
0 rrc msg1
1 as1 msg2
2 as1 msg2
3 a2 msg4
4 as2 msg3
5 a2 msg4
还有其他选择吗?
答案 0 :(得分:1)
初始化子字符串到类别的映射,然后使用str.extract
进行提取,并使用map
对其进行分类:
mapping = dict(zip(
['rrc', 'as1', 'as2', 'a2'],
['msg1', 'msg2', 'msg3', 'msg4']))
df['category'] = (
df['Message'].str.extract(r'(?i)({})'.format('|'.join(mapping)), expand=False)
.map(mapping))
如果不区分大小写很重要,请将正则表达式修改为:r'(?i)({})'.format('|'.join(mapping))
。
最小代码示例
df = pd.DataFrame({'Message': ['this is as1', 'abcd rrc', 'xyz as2']})
df
Message
0 this is as1
1 abcd rrc
2 xyz as2
df['category'] = (
df['Message'].str.extract(r'({})'.format('|'.join(mapping)), expand=False)
.map(mapping))
df
Message category
0 this is as1 msg2
1 abcd rrc msg1
2 xyz as2 msg3