【问题标题】:Combining 2 groupby outputs with lambda using pandas python使用 pandas python 将 2 个 groupby 输出与 lambda 组合
【发布时间】:2020-04-18 12:00:36
【问题描述】:

表(df):

 customer_id Order_date 
     1       2015-01-16      
     1       2015-01-19      
     2       2014-12-21      
     2       2015-01-10      
     1       2015-01-10
     3       2018-01-18
     3       2017-03-04
     4       2019-11-05
     4       2010-01-01
     3       2019-02-03
     3       2019-01-01
     3       2018-01-01

我想要的输出:

使用 groupby 为每个客户 ID 提取 order_dates 数量(一个人至少有 3 笔交易)的代码,我还需要说最近的交易日期。

        Customer_id     No_order_date    Most recent order date
            1                3          2015-01-19

            3                5          2019-02-03

到目前为止尝试过的代码:

 freq = 3 
 df.groupby('customer_id')['order_date'].nunique().loc[lambda x: 
 x>=freq].reset_index().rename(columns={'order_date':'No_Order_Dates'})

        Customer_id     No_Order_Dates    
            1                3                              
            3                5          


 df.groupby('customer_id')['order_date'].max().reset_index().rename(columns= 
 {'order_date':'Most recent order Date'})

       Customer_id              Most recent order date
            1                          2015-01-19
            3                          2019-02-03

如何组合两个 groupby 输出?我需要两个都在一个表中(有没有一种方法可以在不使用连接或合并的情况下加入,或者我必须只使用连接/合并)

【问题讨论】:

  • df.groupby('customer_id')['Order_date'].agg({'Order_date_nunique':'nunique','Most recent order date':'max'}) ?
  • 或命名为 agg:df.groupby('customer_id').agg(Order_date = ('Order_date','nunique'),Most_recent_order_date = ('Order_date','max')) 没问题 :)
  • 这样更好,因为我还可以使用命名聚合来聚合其他列
  • df.groupby('customer_id').agg(No_transactions=('order_date','nunique().loc[lambda x: x>=7]',Most_recent_order_date = ('order_date', 'max')) 不起作用。Lambda 在聚合的情况下不起作用?@anky_91
  • 请重新打开问题'

标签: python pandas merge group-by


【解决方案1】:

您可以在 groupby 之后使用与 .loc[] 相同的命名聚合:

(df.groupby('customer_id').agg(No_transactions=('Order_date','nunique'),
           Most_recent_order_date = ('Order_date', 'max'))
            .loc[lambda x: x['No_transactions']>=3])

或查询:

(df.groupby('customer_id').agg(No_transactions=('Order_date','nunique'),
       Most_recent_order_date = ('Order_date', 'max'))
        .query("No_transactions>=3"))

             No_transactions Most_recent_order_date
customer_id                                        
1                          3             2015-01-19
3                          5             2019-02-03

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2018-05-13
    • 1970-01-01
    • 2023-03-23
    • 2020-11-20
    • 2014-11-23
    • 2021-12-24
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多