我有
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')
,但不知道如何将它们全部拼接在一起以测试并为列中的每一行返回正确的值
有什么建议吗?
答案 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