看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是需要计算每名客户还够最低还款额的日期,第1个客户在 5 月 11 日这天累计入账1100元 大于 最低还款额1000元,故针对客户 1 所求日期为20210511。
我们要使用的数据如下:
'''
userid mini_amt amount date
1 1000 300 20210501
1 1000 800 20210511
1 1000 200 20210521
2 5000 2400 20210510
2 5000 500 20210514
2 5000 1000 20210518
2 5000 3000 20210529
2 5000 300 20210531
'''
import pandas as pd
df = pd.read_clipboard()
df
# ...
字段说明:
先看看单个用户,以用户 1 为例,并增加一列累积入账金额:
(
df.loc[df.userid == 1]
.sort_values('date')
.assign(累积入账=lambda x: x.amount.cumsum())
)
'''
userid mini_amt amount date 累积入账
0 1 1000 300 20210501 300
1 1 1000 800 20210511 1100
2 1 1000 200 20210521 1300
'''
然后选择出累积入账金额 >= 最低还款金额的数据,取最近的日期:
(
df.loc[df.userid == 1]
.sort_values('date')
.assign(累积入账=lambda x: x.amount.cumsum())
.query('累积入账 >= mini_amt')
.date
.iat[0]
)
# 20210511
再将上边的算法封装成一个函数:
def get_date(df):
return (
df.sort_values('date')
.assign(累积入账=lambda x: x.amount.cumsum())
.query('累积入账 >= mini_amt')
.date
.iat[0]
)
按用户分组并应用这个函数:
df.groupby('userid').apply(get_date)
'''
userid
1 20210511
2 20210529
dtype: int64
'''
这样就得到了最终结果。
(完)
更新时间:2024-08-18 15:55:03 标签:pandas python 计算