如果列在列表的任何部分中,则过滤数据框

时间:2019-05-21 19:49:24

标签: python pandas dataframe

我正在尝试将数据框过滤为具有列表中列值的行。但是,该列中的值将与列表不完全匹配。我可以做某种通配符或进一步包含吗?

例如,基于下面的列表和数据框,我想返回或过滤到第0行。

list = ["123 ABC", "456 DEF", "789 GHI"]

id    idlist
0      ABC    
1      XYZ

类似

df_2 = df[df["idlist"].isin(list)]

将不起作用,因为它将搜索完全匹配。

2 个答案:

答案 0 :(得分:1)

这是一个比平常更复杂的字符串匹配问题,但是您可以使用列表理解来提高性能:

lst = ["123 ABC", "456 DEF", "789 GHI"]
df['match'] = [any(x in l for l in lst) for x in df['idlist']]
df

   id idlist  match
0   0    ABC   True
1   1    XYZ  False

要简单过滤,请使用

df[[any(x in l for l in lst) for x in df['idlist']]]

   id idlist
0   0    ABC

列表推导是许多字符串操作的常用语法。我在For loops with pandas - When should I care?中写了一篇关于它们的优点的详细文章。

如果需要处理NaN,请使用带有try-catch处理功能。

def search(x, lst):
    try:
        return any(x in l for l in lst)
    except TypeError:
        return False

df[[search(x, lst) for x in df['idlist']]]

   id idlist
0   0    ABC

答案 1 :(得分:0)

您可以使用运算符库检查字符串是否部分包含:

import operator
operator.contains('ABC','123 ABC')