如何根据包含条件的字符串创建新的数据框列
How to create a new columns of dataframe based on string containing condition
我有一个 pandas 数据框,如下所示:
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])] ))
但是 for 循环对于 >1000000 行的数据帧是不合理的,就像我的真实数据帧一样。是否有更有效的方法来使用这些 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
我有一个 pandas 数据框,如下所示:
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])] ))
但是 for 循环对于 >1000000 行的数据帧是不合理的,就像我的真实数据帧一样。是否有更有效的方法来使用这些 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