python - 如何根据包含条件的字符串创建新的数据框列
问题描述
我有一个如下的熊猫数据框:
df = pd.DataFrame({'Date':['10/2/2011', '11/2/2011', '12/2/2011', '13/2/2011'],
'Phrases':['I have a cool family', 'I like avocados', 'I would like to go to school', 'I enjoy Harry Potter']})
和一个关键字列表如下
l=['cool','avocado','lord of the rings']
我想在数据框中使用 True/False 值创建一个新列。这将取决于“短语”中的每个实体是否包含列表“l”的一个或多个关键字。在这种情况下,新列应为 True、True、False、False。
这对于短数据帧很简单,
for i in ...
str(bool([ele for ele in (keyword list) if(ele in df.Phrases[i])] ))
但是对于 >1000000 行的数据帧,for 循环是不合理的,就像我的真实数据帧一样。是否有更有效的方法来创建具有这些 True/False 值的新列。
解决方案
您可以通过pd.Series.str.contains
将列表l
作为 OR 字符串来做到这一点:
import re
import pandas as pd
df = pd.DataFrame({'Date':['10/2/2011', '11/2/2011', '12/2/2011', '13/2/2011'],
'Phrases':['I have a cool family', 'I like avocados', 'I would like to go to school', 'I enjoy Harry Potter']})
l=['cool','avocado','lord of the rings']
df['new_column']=df['Phrases'].str.contains('|'.join(l))
df['matched strings']=df['Phrases'].apply(lambda x: ','.join(re.findall('|'.join(l),x)))
df
Out[18]:
Date Phrases new_column matched strings
0 10/2/2011 I have a cool family True cool
1 11/2/2011 I like avocados True avocado
2 12/2/2011 I would like to go to school False
3 13/2/2011 I enjoy Harry Potter False
推荐阅读
- r - Distance Between Points Within Radius at Time Intervals
- angular - 为什么孩子没有检测到来自父母输入的角度变化
- selenium - 使用 Selenium 测试画布图形
- java - 如何解释 Swagger/Jersey REST 客户端中的响应?
- c++ - 我可以创建一个 unique_ptr 数组吗
(n), n 在运行时声明,不循环元素? - php - 使用php解码多维json数组
- javascript - 使用特定的错误消息调用测试下一个中间件
- ajax - 如何通过忽略路由来调用控制器方法
- elasticsearch - 如何告诉 Elasticsearch 返回带有搜索结果的搜索参数?
- ruby-on-rails - 将 Rails active_storage 与 js 上传器集成