用字符串将数据框的值分组

时间:2019-06-13 19:04:25

标签: python string pandas

以下代码可用于对单个邮件进行分类

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

还有其他选择吗?

1 个答案:

答案 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