繁体   English   中英

按 pandas dataframe 中的列表过滤行

[英]Filtering rows by lists in pandas dataframe

我想根据两个列表过滤我的数据集,如下所示:

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,但我需要两个词(或房地产 + harry)可以在同一行中,无论是否在两列而不是一列中。 我从我之前的一个问题中知道我应该使用 apply 类似的东西

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

但是考虑到两个单独的列表(如问题的顶部),我很难添加条件房地产 + limone 或房地产 + harry。 我目前正在迭代两次:

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)]

有没有办法将这两个代码压缩为一个?

Output:

 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...

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

我希望我能正确理解这个案例:我们有一个“强制性”单词列表(如果它们不存在,则整行不相关),以及一个“理想”单词列表。 也许您可以进行内部连接以查找包含强制性和理想术语的行:

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'
    ) 

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

如果您还需要仅分析包含强制性单词的行,则第一种方法会更有用。 第二种方法可能不太有用,因为强制和“理想”将是等效的(如果两者都需要存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM