如何在Pandas中将DataFrame单列值转换为多列值
Pandas DataFrame 结构转换实现方法
原始数据结构
| id | date | decision |
|---|---|---|
| 1 | 2022-11-10 | improve |
| 1 | 2022-11-10 | checked |
| 2 | 2021-09-12 | checked |
| 3 | 2020-08-22 | checked |
| 4 | 2019-11-10 | complete |
| 4 | 2019-11-10 | revise |
目标数据结构
| id | date | CR | Principal |
|---|---|---|---|
| 1 | 2022-11-10 | checked | improve |
| 2 | 2021-09-12 | checked | NA |
| 3 | 2020-08-22 | checked | NA |
| 4 | 2019-11-10 | revise | complete |
实现方法一:分组自定义转换
核心逻辑是按id和date分组,根据每组内的decision集合判断目标列取值:
CR优先取revise,无revise则取checkedPrincipal取improve或complete,无对应值则设为NA
import pandas as pd # 构造原始DataFrame(已有数据可跳过此步) df = pd.DataFrame({ 'id': [1,1,2,3,4,4], 'date': ['2022-11-10','2022-11-10','2021-09-12','2020-08-22','2019-11-10','2019-11-10'], 'decision': ['improve','checked','checked','checked','complete','revise'] }) def process_group(group): decisions = set(group['decision']) cr_val = 'revise' if 'revise' in decisions else 'checked' principal_val = next((d for d in ['improve', 'complete'] if d in decisions), pd.NA) return pd.Series({'CR': cr_val, 'Principal': principal_val}) # 分组处理并重置索引 result_df = df.groupby(['id', 'date']).apply(process_group).reset_index() print(result_df)
实现方法二:透视表映射转换
先给每个decision标记对应的目标列,再通过透视表重组结构,最后调整冲突取值:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,2,3,4,4], 'date': ['2022-11-10','2022-11-10','2021-09-12','2020-08-22','2019-11-10','2019-11-10'], 'decision': ['improve','checked','checked','checked','complete','revise'] }) # 标记每个decision对应的目标列 df['target_col'] = df['decision'].map({ 'checked': 'CR', 'revise': 'CR', 'improve': 'Principal', 'complete': 'Principal' }) # 透视表重组结构 result_df = df.pivot(index=['id', 'date'], columns='target_col', values='decision').reset_index() # 处理CR列:同时存在checked和revise时保留revise result_df['CR'] = result_df['CR'].apply(lambda x: 'revise' if isinstance(x, str) and 'revise' in x else x) # 填充缺失值为NA result_df = result_df.fillna(pd.NA) print(result_df)
内容的提问来源于stack exchange,提问作者Swetha
相关产品推荐
相关产品推荐

