求助实现简单Pandas行列转换与日期关联金额计算
需求说明
需要对DataFrame中的数值进行简单计算,步骤如下:
- 先转换日期相关列的格式为日期类型;
- 按
姓名分组,对每组数据计算:- 距离
日期2最近的金额(最近指日期1离日期2的时间差最小),记为最近金额(MRA) - 第二近的金额,记为第二近金额(2MRA)
- 距离
- 计算
MRA / 2MRA的比值; - 根据比值是否≤0.5,输出二进制结果(1或0)。
原始数据
| 姓名 | 金额 | 日期1 | 日期2 |
|---|---|---|---|
| Jim | 100 | 2021-06-10 | 2021-06-15 |
| Jim | 200 | 2021-05-11 | 2021-06-15 |
| Jim | 150 | 2021-03-05 | 2021-06-15 |
| Bob | 350 | 2022-06-10 | 2022-08-30 |
| Bob | 300 | 2022-08-12 | 2022-08-30 |
| Bob | 400 | 2021-07-06 | 2022-08-30 |
期望输出
| 姓名 | 金额 | 日期2 | 最近金额(MRA) | 第二近金额(2MRA) | MRA/2MRA | 是否≤0.5 |
|---|---|---|---|---|---|---|
| Jim | 100 | 2021-06-15 | 100 | 200 | 0.5 | 1 |
| Bob | 300 | 2022-08-30 | 300 | 350 | 0.85 | 0 |
实现代码(Python Pandas)
import pandas as pd # 构造原始数据 df = pd.DataFrame({ '姓名': ['Jim', 'Jim', 'Jim', 'Bob', 'Bob', 'Bob'], '金额': [100, 200, 150, 350, 300, 400], '日期1': ['2021-06-10', '2021-05-11', '2021-03-05', '2022-06-10', '2022-08-12', '2021-07-06'], '日期2': ['2021-06-15', '2021-06-15', '2021-06-15', '2022-08-30', '2022-08-30', '2022-08-30'] }) # 转换日期列为datetime类型 df['日期1'] = pd.to_datetime(df['日期1']) df['日期2'] = pd.to_datetime(df['日期2']) # 计算日期1与日期2的天数差绝对值,用于判断远近 df['时间差'] = (df['日期2'] - df['日期1']).dt.days.abs() # 按姓名分组,按时间差升序排序后取每组前2条数据 grouped = df.groupby('姓名').apply(lambda x: x.sort_values('时间差').head(2)).reset_index(drop=True) # 提取每组的最近和第二近金额 result = grouped.groupby('姓名').agg( 日期2=('日期2', 'first'), 最近金额MRA=('金额', 'first'), 第二近金额2MRA=('金额', 'last') ).reset_index() # 计算比值和二进制结果 result['MRA/2MRA'] = (result['最近金额MRA'] / result['第二近金额2MRA']).round(2) result['是否≤0.5'] = (result['MRA/2MRA'] <= 0.5).astype(int) # 合并原始数据的对应金额列,对齐输出格式 final_result = pd.merge( df[['姓名', '金额', '日期2']].drop_duplicates(subset=['姓名', '日期2']), result, on=['姓名', '日期2'] ) # 调整列顺序为期望格式 final_result = final_result[['姓名', '金额', '日期2', '最近金额MRA', '第二近金额2MRA', 'MRA/2MRA', '是否≤0.5']] print(final_result)
代码说明
- 先转换日期列格式,确保能正确计算时间差;
- 通过
时间差字段判断日期1与日期2的接近程度; - 按姓名分组排序后取前2条,分别对应最近和第二近的金额;
- 用
astype(int)将布尔判断结果转为1/0格式的二进制值; - 最后合并原始数据的金额列,匹配期望输出的列顺序。
内容的提问来源于stack exchange,提问作者coderguy
相关产品推荐
相关产品推荐

