【问题标题】:Filtering within groupby function pandas在 groupby 函数 pandas 中过滤
【发布时间】:2023-03-29 04:26:01
【问题描述】:

我在 pandas 中工作,并且有一个带有 TradeID、Seller ID 和 Payment date 的销售信息数据框,我想为每个 Seller ID 计算在当前交易日期之前之前成功交易的数量,卖家有过的。我相当确定这是一个拆分应用组合样式的解决方案,但我不知道如何实现它。

数据看起来有点像这样

|---------|-----------|-------------|------------|
|Trade ID | Seller ID | Payment Date|Success?    |
|---------|-----------|-------------|------------|
|001      |001        |08/12/2016   |Yes         |
|002      |001        |07/12/2016   |Yes         |
|003      |001        |12/12/2016   |No          |
|004      |001        |13/12/2016   |Yes         |
|005      |001        |14/12/2016   |Null        |
|005      |002        |18/01/2012   |Yes         |
|006      |002        |01/01/2011   |Null        |
|007      |003        |07/02/2010   |Yes         |

我正在寻找类似的输出:

|---------|-----------|-------------|------------|--------------------------|
|Trade ID | Seller ID | Payment Date|Success?    |Previous Succesful Trades |
|---------|-----------|-------------|------------|--------------------------|
|001      |001        |08/12/2016   |Yes         |1                         |
|002      |001        |07/12/2016   |Yes         |0                         |
|003      |001        |12/12/2016   |No          |2                         |
|004      |001        |13/12/2016   |Yes         |2                         |
|005      |001        |14/12/2016   |Null        |3                         |
|005      |002        |18/01/2012   |Yes         |1                         |
|006      |002        |01/01/2011   |Null        |0                         |
|007      |003        |07/02/2010   |Yes         |0                         |

我可以汇总每个卖家的成功交易,但这并没有考虑到卖家进行交易时他们还没有完成数据框中的所有交易的事实。例如,在 2016 年 12 月 12 日,卖家 1 将不会在 2016 年 12 月 13 日完成交易,因此他们之前成功完成的交易是 2 而不是 3。

非常感谢任何帮助!

【问题讨论】:

    标签: python pandas filter group-by


    【解决方案1】:

    您可以应用过滤器,然后使用groupbycount

    df[df['Success'] == 'Yes'].groupby(['Seller ID'])['Success'].count()
    
    Seller ID
    001    1
    002    1
    

    【讨论】:

      【解决方案2】:
      df.loc[( df['Success?'] == 'Yes' )  , 'Succ'] = 1
      
      df['sumofprevios'] = ( df.groupby('Seller ID')['Succ'].apply(lambda x: x.shift().expanding().sum()))
      
      # you can drop Succ column now. 
      

      如果这不是您需要的,请告诉我。

      【讨论】:

      • 谢谢!我认为这看起来可能可行,但 Success 列中有一些 NA 导致聚合失败,对不起,我应该把它放在问题中。
      • 我最终成功地使用了这个解决方案,但只需要先按日期快速排序数据框。感谢您的帮助
      【解决方案3】:

      我能想到的最简单的方法是首先将“是”和“否”替换为 True 和 False,然后将 Seller ID 分组并总结 Success?

      df['Success?'] = df['Success?'].replace({'Yes':True, 'No': False})
      df.groupby('Seller ID')['Success?'].sum()
      

      【讨论】:

        【解决方案4】:

        pandas 文档对于找出这些解决方案非常有帮助!以下是一种也允许记录不成功交易的可能性。

        df = pd.DataFrame(
        {"Trade ID":[1,2,3,4,5,6],
        "Seller ID":[1,1,2,2,2,2],
        "Payment Date":["2016-12=08","2016-12-12","2012-01-18","2016-02=08","2016-12-16","2012-01-31"],
        "Success?":["Yes","No", "Yes", "Yes","No", "Yes"]})
        

        然后按卖家 ID 分组

        grouped_seller = df.groupby("Seller ID")
        

        然后您可以做多种不同的事情,但价值计数将计算每个卖家 ID 的 YES 或 No 次数

        grouped_seller["Success?"].value_counts()
        
        
        Seller ID  Success?
        1          No          1
                   Yes         1
        2          Yes         3
                   No          1
        Name: Success?, dtype: int64
        

        然后您可以使用 .loc[] 访问卖家 ID

        grouped_seller["Success?"].value_counts().loc[2]
        
        Success?
        Yes    3
        No     1
        Name: Success?, dtype: int64
        

        注意除非您将日期转换为日期时间,否则我创建的数据框将不会具有与您相同的 dtypes

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-06
          • 2013-07-30
          • 2017-01-20
          • 2018-07-22
          • 2013-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多