【问题标题】:How to do a complicated filter in python如何在python中做一个复杂的过滤器
【发布时间】:2018-06-08 11:33:55
【问题描述】:

我正在尝试基于一列进行过滤。例如,我想在看到它有 account_no 1111 时删除该交易

输入

Date        Trans   account_no
2017-12-11  10000   1111
2017-12-11  10000   1112
2017-12-11  10000   1113
2017-12-11  10001   1111
2017-12-11  10002   1113

期望的输出

Date        Trans   account_no
2017-12-11  10002   1113

编辑:

这与运算符链接不同,因为您正在处理重复/条件过滤器

【问题讨论】:

标签: python pandas filter duplicates


【解决方案1】:

您可以分两步完成此操作。首先使用.loc 查找所有account_no 等于1111 的Trans 值。然后选择isin()的所有其他交易

df[~df.Trans.isin(df.loc[df.account_no == 1111,'Trans'])]

         Date  Trans  account_no
4  2017-12-11  10002        1113

【讨论】:

    【解决方案2】:

    您可以使用.loc 进行基于系列的过滤。

    def complex_filter_criteria(x):
        return x != 1111
    df.loc[df['account_no'].apply(complex_filter_criteria)]
    

    df['account_no'].apply(complex_filter_criteria) 将为account_no 列中的每个条目返回一系列True/False 评估。然后,当您将其传递给df.loc 时,它会返回一个数据框,该数据框仅包含与系列中的True 评估相对应的行。

    【讨论】:

      【解决方案3】:

      通过使用issubset + transform

      df[~df.groupby('Trans').account_no.transform(lambda x : set([1111]).issubset(x))]
      Out[1658]: 
               Date  Trans  account_no
      4  2017-12-11  10002        1113
      

      【讨论】:

      • 您知道如何修改代码以过滤掉多个数字,而不仅仅是 1111,还可以添加 1112
      • @ReeseFitzmaurice df[~df.Trans.isin(df.loc[df.account_no.isin([1112,1111]),'Trans'])]
      • 我还在尝试保持原来的问题逻辑,这样行吗? df=df[~df.groupby('Trans').account_no.transform(lambda x : set([1112,1111]).issubset(x))]
      • @ReeseFitzmaurice 这不会,因为它们将同时匹配 [1112 和 1111,当两个条件都满足时,它们将返回 true,似乎您需要逻辑或而不是正确的?
      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多