基于Pandas实现DataFrame按org_id的宽表转换及金额列提取
Pandas DataFrame 转宽表问题
我有一个名为data的Pandas DataFrame,结构如下:
| org_id | commit_date | commit_amt |
|---|---|---|
| 123 | 2020-06-01 | 50000 |
| 123 | 2020-06-01 | 50000 |
| 123 | 2021-06-01 | 60000 |
| 234 | 2019-07-01 | 30000 |
| 234 | 2020-07-01 | 40000 |
| 234 | 2021-07-01 | 50000 |
希望将其转换为如下格式的宽表:
| org_id | date_1 | date_2 | date_3 | amt_1 | amt_2 | amt_3 |
|---|---|---|---|---|---|---|
| 123 | 2020-06-01 | 2021-06-01 | 2022-06-01 | 50000 | 50000 | 60000 |
| 234 | 2019-07-01 | 2020-07-01 | 2021-07-01 | 30000 | 40000 | 50000 |
已实现的代码(日期列提取)
通过以下代码成功获取了org_id列和日期列:
dates = data.groupby('org_id').apply(lambda x: x['commit_date'].unique()) # 获取每个org_id对应的唯一commit_date dates = dates.apply(pd.Series) # 将每个唯一日期放到单独列,日期不足的org_id对应位置为NaN c_dates = pd.DataFrame() # 创建空DataFrame c_dates['org_id'] = dates.index # 指定org_id列 c_dates['date_1'] = dates[0].values.tolist() c_dates['date_2'] = dates[1].values.tolist() c_dates['date_3'] = dates[2].values.tolist()
遇到的问题
上述代码无法正确提取amt_1、amt_2、amt_3列:
- 复用日期列的代码会丢失org_id=123对应的重复金额50000
c_dates与原data长度不匹配,无法直接关联
尝试的其他代码
尝试了以下代码取得部分进展,但格式不符合要求:
dates = data.groupby(['org_id','commit_amt']).apply(lambda x: x['commit_date'].unique()) # 获取每个(org_id, commit_amt)对应的唯一commit_date dates = dates.apply(pd.Series) # 将每个唯一日期放到单独列,日期不足的对应位置为NaN
生成的表格如下:
| org_id | commit_amt | ||
|---|---|---|---|
| 123 | 50000 | 2020-06-01 | 2021-06-01 |
| 123 | 60000 | 2022-06-01 | |
| 234 | 30000 | 2019-07-01 | |
| 234 | 40000 | 2020-07-01 | |
| 234 | 50000 | 2021-07-01 |
最终需求
希望将数据调整为目标格式,以便计算amt_1与amt_2等的差值。
后续更新
已解决问题,所需函数为unstack,后续将补充完整方案。
内容的提问来源于stack exchange,提问作者Ess Jay
相关产品推荐
相关产品推荐

