【问题标题】:Python - Keep all rows of a group if a name is contained in any rowPython - 如果名称包含在任何行中,则保留组的所有行
【发布时间】:2021-07-14 18:40:13
【问题描述】:

我有一份包含发票 ID 和审批人的报告。发票可以有多个审批人,这会导致 ID 重复(这很好)。我想要做的是检查每组发票 ID,以查看 2 个批准者中的任何一个是否在与该 ID 关联的批准者列表中。如果是,那么我想保留该 ID 的 all 行。我认为我的问题与这个问题类似:Drop all rows in a group if none of the rows match a specific condition 但是还没有人回答这个问题。下面是我想要做的一个例子。

**Invoice Id**    **Approver**
149877RV    Jane Doe
149877RV    Joe Manchin
149877RV    Michael Frank
149877RV    Kevin Holder
149877RV    Michael Frank
149877RV    Michael Frank
149877RV    James Doe

Michael Frank 和 Kevin Holder 是我正在寻找的名字。由于它们都存在于此(在我的场景中,它可以是其中之一)我想保留所有这些行。

150210  Jim Halpert   
150210  Mike Smith
150210  FP&A 
150210  Michael Scott

由于 Michael Frank 和 Kevin Holder 都不在此列表中,我想删除所有这些行。

我无法找到一种解决方案,让我可以按照我的描述保留所有行。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    这应该可行:

    import pandas as pd
    
    df = pd.DataFrame({'invoice_ID': ['149877RV' ,'149877RV' ,'149877RV','149877RV','149877RV','149877RV','149877RV'], 
                       'Approver': ['Jane Doe','Joe Manchin','Michael Frank','Kevin Holder','Michael Frank','Michael Frank','James Doe']})
    
    mask=df['Approver'].isin(['Michael Frank','Kevin Holder'])
    df1=df.loc[mask]
    df1=df1.drop_duplicates(subset=['invoice_ID'])
    mask2=df['invoice_ID'].isin(df1['invoice_ID'])
    
    final_list=df.loc[mask2]
    

    【讨论】:

      【解决方案2】:

      我认为您应该检查每个可用发票 ID 的状况。 然后检查您的状况并返回结果。我合并了您的数据以使其更清晰

      
      data = {"invoice_id": ["149877RV", "149877RV", "149877RV", "149877RV", "149877RV", "149877RV", "149877RV", "150210", "150210", "150210", "150210"],
              "approver": ["Jane Doe", "Joe Manchin", "Michael Frank", "Kevin Holder", "Michael Frank", "Michael Frank", "Jane Doe", "Jim Halpert", "Mike Smith", "FP&A", "Michael Scott"]}
      
      df = pd.DataFrame.from_dict(data)
      
      approver_1, approver_2 = "Michael Frank", "Kevin Holder"
      
      results = []
      for id in set(df["invoice_id"]):
          approvers_per_id = set(df.loc[df.loc[:, "invoice_id"] == id, "approver"])
          if approver_1 in approvers_per_id and approver_2 in approvers_per_id:
              results.append(df.loc[df.loc[:, "invoice_id"] == id])
      print(results)
      

      返回

      [  invoice_id       approver
      0   149877RV       Jane Doe
      1   149877RV    Joe Manchin
      2   149877RV  Michael Frank
      3   149877RV   Kevin Holder
      4   149877RV  Michael Frank
      5   149877RV  Michael Frank
      6   149877RV       Jane Doe]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多