【问题标题】:How to filter dataframe for column with lists contains value [duplicate]如何过滤具有列表的列的数据框包含值[重复]
【发布时间】:2018-08-07 02:09:59
【问题描述】:

我们有一列包含列表的数据框。找不到简单的方法来过滤列表中包含值的行的数据框。

df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})

例如,我只需要在其列表中包含“a”的行。 我只能通过“应用”来获得它。

df[df.lists.apply(lambda x: True if 'a' in x else False)]
>>>     lists
>>>0    [a, c]
>>>1    [a, b, d]

有没有类似 .isin() 的东西,反之亦然? 获得所需行的最佳方法是什么? 谢谢。

【问题讨论】:

    标签: python list pandas filter


    【解决方案1】:

    最简单的方法是使用applyin

    df1 = df[df.lists.apply(lambda x: 'a' in x)]
    

    但是如果要检查a创建DataFrame,但是有点复杂:

    df1 = df[pd.DataFrame(df.lists.values.tolist()).eq('a').any(axis=1)]
    

    另一种解决方案是使用str.joinstr.contains

    df1 = df[df.lists.str.join(',').str.contains('a')]
    

    print (df1)
           lists
    0     [a, c]
    1  [a, b, d]
    

    【讨论】:

      【解决方案2】:

      通过列表推导进行布尔索引是一种方法:

      df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})
      
      df[['a' in x for x in df['lists'].values]]
      
      #        lists
      # 0     [a, c]
      # 1  [a, b, d]
      

      一些性能基准测试:

      df = pd.DataFrame({'lists':[['a', 'c'], ['a', 'b', 'd'], ['c', 'd']]})
      
      df = pd.concat([df]*100000)
      
      def jez1(df):
          return df[df.lists.apply(lambda x: 'a' in x)]
      
      def jez2(df):
          return df[pd.DataFrame(df.lists.values.tolist()).eq('a').any(axis=1)]
      
      def jez3(df):
          return df[df.lists.str.join(',').str.contains('a')]
      
      def jp(df):
          return df[['a' in x for x in df['lists'].values]]
      
      %timeit jez1(df)  # 87ms
      %timeit jez2(df)  # 122ms
      %timeit jez3(df)  # 416ms
      %timeit jp(df)    # 53ms
      

      【讨论】:

      • 干得好。谢谢!
      猜你喜欢
      • 2021-11-30
      • 2018-12-20
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2022-01-04
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多