python 在字符串列中查找子字符串(从字符串列表中),并将其作为新列添加到Dataframe中

xyhw6mcr  于 2023-02-02  发布在  Python
关注(0)|答案(4)|浏览(147)

我有以下 Dataframe (df),其中"text"列包含字符串:
| 正文|某事|
| - ------|- ------|
| 文本1显示|...|
| 键盘输入文字2|...|
| 图文电视|...|
| 尤乌特夫布韦韦雷|...|
我还有一个Seriesdf_look_for),其中包含我要查找的字符串:
| 寻找|
| - ------|
| 文本1|
| 文本2|
| 文本3|
我的目标是检查"text"列是否包含"look_for"列中的某个字符串。如果包含,我希望将找到的字符串作为新列添加到df中。例如:
| 正文|某事|发现字符串|
| - ------|- ------|- ------|
| 文本1显示|...|文本1|
| 键盘输入文字2|...|文本2|
| 图文电视|...|文本3|
| 尤乌特夫布韦韦雷|...|NaN|
到目前为止,我尝试使用str.contains(),但还没有成功。
任何帮助都将不胜感激!

syqv5f0l

syqv5f0l1#

下面是将map()next()一起使用的替代方法

df_look = pd.Series(['text1', 'text2', 'text3'])
df['found_str'] = list(map(lambda x: next((y for y in df_look if y in x), 'NaN'), df['text']))
print(df)

您也可以将restr.extract()一起使用:
x一个一个一个一个x一个一个二个x

kxe2p93d

kxe2p93d2#

一种选择是使用带有next的 * listcomp * 来避免嵌套列表。

lookfor = df_look_for["look_for"]
​
df["found_str"] = [next((a for a in lookfor if a in b), None) for b in df["text"]]

输出:

print(df)
​
               text  sth found_str
0    abdcdtext1wrew  ...     text1
1  qwerqdtext2cvufu  ...     text2
2      iuotext3tvbv  ...     text3
3       iuotvbvewre  ...      None
7qhs6swi

7qhs6swi3#

另一个方法。这将给予所有找到的字符串的列表:

import pandas as pd
d = {'text': ['asdtext1', 'sdkjfhtext2sdf', 'dsfds']}
l = {'look_for': ['text1', 'text2']}

look_for_df = pd.DataFrame(data=l)
df = pd.DataFrame(data=d)

df["found_str"] = df['text'].apply(lambda text: [search_word for search_word in look_for_df['look_for'] if search_word in text])

olmpazwi

olmpazwi4#

解决方案:

import re

df_look_for = pd.Series(['text1', 'text2', 'text3'])

pattern = '|'.join(df_look_for)
df['found_str'] = df['text'].str.extract('(' + pattern + ')', expand=False)
df.fillna(value='NaN', inplace=True)

说明:
可以使用str.extract方法沿着正则表达式来实现这一点,其思想是提取与df_look_for中的模式匹配的第一个字符串,并将其作为新列添加到 Dataframe 中。
通过将所有元素与|连接,df_look_for系列被转换为正则表达式模式(逻辑或运算符)。然后使用str.extract方法从text列中提取此模式的第一个匹配项,并将结果存储在found_str列中。使用fillna方法来用串'NaN'替换任何缺失值(即,未发现匹配的值)。

相关问题