按熊猫数据框中的列表过滤行

时间:2020-06-28 22:58:49

标签: python pandas

我想根据两个列表如下过滤数据集:

list_1=['important', 'important words', 'terms to have','limone','harry']
list_2=['additional','extra','terms','to check','estate']

在第一个list_1中,我确实需要在行中使用这些术语;在list_2中,我可能会感兴趣一些期望的附加术语。 我认为问题应该是&|条件的混合,但我无法过滤行。

如果我有

Date        Head                                   Text         
03/01/2020  Estate in vacanza              marea: cosa fare in caso di ...
03/01/2020  Cosa mangiare in estate        il limone è una spezia molto usata durante il periodo estivo
03/01/2020  NaN                            tutti pazzi per l'estate: “pronto, ma se apro le finestre per arieggiare...
03/01/2020  Harry torna in UK              il principe harry torna a buckingham palace in estate...
03/01/2020  Consigli per l'estate          Estate come proteggersi -

如您所见,estate一词几乎出现在所有行中。我需要这个词,但我还需要考虑具有“ limone”或“ harry”的行。 所以我想过滤如下:

estate + limone # to avoid confusion I mean select estate AND limone

estate + harry # to avoid confusion I mean select estate AND harry

Head和/或Text中。我不在乎是否在Head中有遗产,在Text中是否有limone,但是我需要两个单词(或estate + harry)都可以在同一行中,而不管是两列而不是一列。 从之前的一个问题中我知道我应该使用类似

的方法
df[['Head','Text']].apply(lambda x : x.str.contains(something)).any(1)

但考虑到两个单独的列表(如在问题的顶部),我很难添加不动产+ limone或不动产+哈里的条件。 我目前正在重复两次:

df=df[df[['Head, Text']].apply(lambda x : x.str.contains('|'.join(list_1))).any(1)]
df=df[df[['Head, Text']].apply(lambda x : x.str.contains('|'.join(list_2))).any(1)]

有什么办法可以将这两个代码压缩为一个?

输出:

 Date       Head                                   Text         
 03/01/2020 Cosa mangiare in estate        il limone è una spezia molto usata durante il periodo estivo
 03/01/2020 Harry torna in UK              il principe harry torna a buckingham palace in estate...

如果您能在上面的代码行中说明如何设置此条件,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我希望我能正确理解这种情况:我们有一个“强制性”单词列表(如果不存在,则整行都不相关),还有一个“所需”单词列表。也许您可以进行内部联接来查找包含强制性和期望性术语的行:

mandatory = df[(df.Head + df.Text).str.contains('|'.join(mandatory_words))]
desirable = df[(df.Head + df.Text).str.contains('|'.join(desirable_words))]
mandatory_and_desirable = pd.merge(mandatory,desirable, how='inner') 

一起:

mandatory_and_desirable = pd.merge(
    df[(df.Head + df.Text).str.contains('|'.join(mandatory_words))],
    df[(df.Head + df.Text).str.contains('|'.join(desirable_words))]
    how='inner'
    ) 

请注意,这是区分大小写的。

如果您还需要仅分析带有强制性单词的行,则第一种方法会更有用。第二种方法可能用处不大,因为强制性和“合意的”等效(如果需要同时存在)。