You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):

  1. 创建仅包含每个借款人最后一笔贷款的表格
    预期结果:
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
  1. 按借款人分组,仅返回每个借款人第一笔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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:33:19