【问题标题】:How to create a new columns of dataframe based on string containing condition如何根据包含条件的字符串创建新的数据框列
【发布时间】:2021-05-03 00:48:36
【问题描述】:

我有一个如下的熊猫数据框:

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 值创建新列。

【问题讨论】:

    标签: python pandas dataframe boolean


    【解决方案1】:

    您可以使用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                
    

    【讨论】:

    • 太棒了。看起来这是一个很好的解决方案。有没有办法检查 l 短语中包含哪些关键字?并将其存储在新列中?
    • @power_of_epi 是的,我已经编辑了我的答案。如果对您有帮助,请不要忘记接受答案,谢谢
    • 是的,我就是这么做的。很有帮助
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2021-07-11
    • 2021-04-13
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多