【问题标题】:Pandas conditional group by min()通过 min() 进行 Pandas 条件分组
【发布时间】:2022-01-07 21:33:30
【问题描述】:

当本金余额低于支付金额的 5% 时,我试图获取日期变量的最小值。我希望按帐号提取此内容,但我不想要按帐号分组的新 df。

我的 df 看起来像这样:

| account_number | period_date | principal_balance_amt | disbursement_amt |
| -------------: | ----------- | --------------------- | ---------------- |
| 1              | 2021-01-01  | 10                    | 100              |
| 1              | 2021-02-01  | 6                     | 100              |
| 1              | 2021-03-01  | 3                     | 100              |
| 1              | 2021-04-01  | 0                     | 100              |
| 2              | 2021-01-01  | 20                    | 100              |
| 2              | 2021-02-01  | 15                    | 100              |
| 2              | 2021-03-01  | 11                    | 100              |
| 2              | 2021-04-01  | 8                     | 100              |

我已经尝试过类似的代码来使它工作,但它只是返回无效的语法。

df['churn_date'] = df.loc[groupby('account_number').(df['principal_balance_amt'] <= 0.05 * df['disbursement_amt']), 'period_date'].min()

我希望代码创建一个如下所示的 df:

account_number period_date principal_balance_amt disbursement_amt churn_date
1 2021-01-01 10 100 2021-03-01
1 2021-02-01 6 100 2021-03-01
1 2021-03-01 3 100 2021-03-01
1 2021-04-01 0 100 2021-03-01
2 2021-01-01 20 100 nan
2 2021-02-01 15 100 nan
2 2021-03-01 11 100 nan
2 2021-04-01 8 100 nan

【问题讨论】:

    标签: python pandas dataframe pandas-groupby min


    【解决方案1】:

    如果不匹配,使用Series.whereperiod_date 替换为NaN,然后将GroupBy.transformmin 一起用于新列:

    mask = (df['principal_balance_amt'] <= 0.05 * df['disbursement_amt'])
    df['churn_date'] = (df.assign(new = df['period_date'].where(mask))
                          .groupby('account_number')['new']
                          .transform('min'))
    
    print (df)
       account_number period_date  principal_balance_amt  disbursement_amt  \
    0               1  2021-01-01                     10               100   
    1               1  2021-02-01                      6               100   
    2               1  2021-03-01                      3               100   
    3               1  2021-04-01                      0               100   
    4               2  2021-01-01                     20               100   
    5               2  2021-02-01                     15               100   
    6               2  2021-03-01                     11               100   
    7               2  2021-04-01                      8               100   
    
      churn_date  
    0 2021-03-01  
    1 2021-03-01  
    2 2021-03-01  
    3 2021-03-01  
    4        NaT  
    5        NaT  
    6        NaT  
    7        NaT  
    

    Series.map 映射的替代解决方案仅由boolean indexing 过滤的行与聚合min

    mask = (df['principal_balance_amt'] <= 0.05 * df['disbursement_amt'])
    s = df[mask].groupby('account_number')['period_date'].min()
    
    df['churn_date'] = df['account_number'].map(s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2016-09-14
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      相关资源
      最近更新 更多