Python中如何基于特殊条件生成指定DataFrame子集?
问题描述
我正在进行数据处理操作,遇到了如何基于特殊条件生成子集的问题。我的示例DataFrame如下:
Name ID ContractDate LoanSum DurationOfDelay A ID1 2023-01-01 10 0 A ID1 2023-01-03 15 0 A ID1 2022-12-29 20 35 A ID1 2022-12-28 40 91 B ID2 2023-01-05 15 0 B ID2 2023-01-10 30 100 B ID2 2023-01-07 35 40 B ID2 2023-01-06 35 0 C ID3 2023-01-09 20 0 C ID3 2023-01-07 30 0 C ID3 2023-01-11 35 0
我的目标是生成两个不同的子集(两个新的DataFrame):
- 创建仅包含每个借款人最后一笔贷款的表格
预期结果:
Name ID ContractDate LoanSum DurationOfDelay A ID1 2023-01-03 15 0 B ID2 2023-01-10 30 100 C ID3 2023-01-11 35 0
- 按借款人分组,仅返回每个借款人第一笔DurationOfDelay > 0的贷款
预期结果:
Name ID ContractDate LoanSum DurationOfDelay A ID1 2022-12-28 40 91 B ID2 2023-01-07 35 40
解决方案
以下是基于Python pandas库的实现代码:
1. 获取每个借款人的最后一笔贷款
首先将ContractDate转换为日期类型,然后按借款人分组后取每组最新的贷款记录:
import pandas as pd # 构建示例DataFrame df = pd.DataFrame({ 'Name': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C'], 'ID': ['ID1', 'ID1', 'ID1', 'ID1', 'ID2', 'ID2', 'ID2', 'ID2', 'ID3', 'ID3', 'ID3'], 'ContractDate': ['2023-01-01', '2023-01-03', '2022-12-29', '2022-12-28', '2023-01-05', '2023-01-10', '2023-01-07', '2023-01-06', '2023-01-09', '2023-01-07', '2023-01-11'], 'LoanSum': [10, 15, 20, 40, 15, 30, 35, 35, 20, 30, 35], 'DurationOfDelay': [0, 0, 35, 91, 0, 100, 40, 0, 0, 0, 0] }) # 转换日期列格式 df['ContractDate'] = pd.to_datetime(df['ContractDate']) # 按日期排序后分组取最后一行 last_loan_df = df.sort_values('ContractDate').groupby(['Name', 'ID'], as_index=False).last() print(last_loan_df)
执行后即可得到每个借款人的最后一笔贷款记录。
2. 获取每个借款人第一笔逾期贷款
先筛选出逾期记录,再按借款人分组取每组最早的逾期记录:
# 筛选逾期记录,排序后分组取第一行 first_overdue_df = df[df['DurationOfDelay'] > 0].sort_values('ContractDate').groupby(['Name', 'ID'], as_index=False).first() print(first_overdue_df)
这段代码先过滤出DurationOfDelay > 0的行,按合同日期升序排序后,分组取每组第一行,即为该借款人的第一笔逾期贷款。
内容的提问来源于stack exchange,提问作者lenpyspanacb
相关产品推荐
相关产品推荐

