【问题标题】:Filter Dataframe if column is in any part of list如果列在列表的任何部分中,则过滤数据框
【发布时间】:2019-10-08 06:30:03
【问题描述】:

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

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

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

id    idlist
0      ABC    
1      XYZ

有点像

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

不会工作,因为它会搜索完全匹配。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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
    

    【讨论】:

    • 工作完美。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-10
      • 2021-02-11
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多