根据另一个单词的存在来创建新列

时间:2019-11-27 16:15:49

标签: pandas dataframe substring

我有

pd.DataFrame({'text':['fewfwePDFerglergl','htrZIPg','gemlHTML']})
    text
0   wePDFerglergl
1   htrZIPg
2   gemlHTML

一万行的列。每列包含['PDF','ZIP','HTML']中的一个。文本中每个条目的长度最大为14个字符。

我如何获得:

pd.DataFrame({'text':['wePDFerglergl','htrZIPg','gemlHTML'],'file_type':['pdf','zip','html']})
    text            file_type
0   wePDFerglergl   pdf
1   htrZIPg         zip
2   gemlHTML        html

我为单个条目尝试了df.text[0].find('ZIP'),但不知道如何将它们全部拼接在一起以测试并为列中的每一行返回正确的值

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我们可以在此处将str.extract与正则表达式标志一起用于大小写敏感的(?i)

words =  ['pdf','zip','html']
df['file_type'] = df['text'].str.extract(f'(?i)({"|".join(words)})')

或者我们使用flags=re.IGNORECASE参数:

import re
df['file_type'] = df['text'].str.extract(f'({"|".join(words)})', flags=re.IGNORECASE)

输出

                text file_type
0  fewfwePDFerglergl       PDF
1            htrZIPg       ZIP
2           gemlHTML      HTML

如果您希望file_type小写,请链接str.lower()

df['file_type'] = df['text'].str.extract(f'(?i)({"|".join(words)})')[0].str.lower()
                text file_type
0  fewfwePDFerglergl       pdf
1            htrZIPg       zip
2           gemlHTML      html

详细信息: 管道(|)是正则表达式中的or运算符。因此:

"|".join(words)

'pdf|zip|html'

我们用伪代码得到以下内容:

  

从我们的字符串中提取“ pdf”或“ zip”或“ html”

答案 1 :(得分:0)

您可以为此使用正则表达式:

import re
regex = re.compile(r'(PDF|ZIP|HTML)')

这与任何所需的子字符串匹配。为了在适当的情况下按顺序提取这些匹配项,请使用以下代码:

file_type = [re.search(regex, x).group().lower() for x in df['text']]

这将返回以下列表:

['pdf', 'zip', 'html']

然后添加列:

df['file_type'] = file_type