繁体   English   中英

Pandas 按 min() 条件分组

[英]Pandas conditional group by min()

当本金余额低于支付金额的 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:

帐号 period_date principal_balance_amt 支付金额 流失日期
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
2 2021-02-01 15 100
2 2021-03-01 11 100
2 2021-04-01 8 100

如果不匹配,则使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM