删除列中一组关键字后的文本

2024-05-03 19:56:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,看起来如下所示

df = pd.DataFrame({'person_id': [11,11,11,11,11,11],
                   'details':['DOSE: 667 mg - TDS with food - Inject','DOSE: 667 mg - TDS with food - PO PRN Test','DOSE: 667 mg - TDS with food - Tube','DOSE: 667 mg - TDS with food - Inject  hypo gdksajgfkjsagf > 4 test value here','DOSE: 667 mg - TDS with food - Tube START 10:00 AM','DOSE: 667 mg - TDS with food - PO QTY removed']})

我想根据下面的逻辑从details列中删除部分文本

a)如果文本值包含PRNHypoSTARTQTY removed等关键字,则删除这些关键字后面的所有内容关键字也可以是小写或大写

我在尝试下面的东西

df['text'].str.rsplit(r'prn|hypo|start|qty removed', 1).str.get(0) # this doesn't work

我希望我的输出如下所示。请注意,我的datatset有400-500万条记录,因此任何高效、优雅的方法都会非常有用

enter image description here


2条回答

我们可以按顺序用{}做{a1} 不区分大小写

df['details'] = df['details'].str.replace('prn|hypo|start|qty removed', '', 
                                          regex=True, case=False)

您可以使用Series.str.replace而不是rsplit

df['details'] = df['details'].str.replace(r'(?i)\s*\b(prn|hypo|start|qty removed).*', '')
# >>> df['details'].str.replace(r'(?i)\s*\b(prn|hypo|start|qty removed).*', '')
# 0    DOSE: 667 mg - TDS with food - Inject
# 1        DOSE: 667 mg - TDS with food - PO
# 2      DOSE: 667 mg - TDS with food - Tube
# 3    DOSE: 667 mg - TDS with food - Inject
# 4      DOSE: 667 mg - TDS with food - Tube
# 5        DOSE: 667 mg - TDS with food - PO
# Name: details, dtype: object

regex demo。详情:

  • (?i)-使正则表达式搜索不区分大小写的内联修饰符
  • \s*-零个或多个空格字符
  • \b-一个完整的单词标记,单词边界
  • (prn|hypo|start|qty removed)-一组可选字符串(捕获,您可以通过将(替换为(?:将其转换为非捕获)
  • .*-行的其余部分(除换行符以外的任何零个或多个字符,尽可能多)

相关问题 更多 >