如何在Pandas中透视DataFrame并生成新列存储状态值
表格透视转换解决方案
需求说明
需要将原始表格中的独立日期列(如1/1/2022)转换为Effective Date行值,对应状态值存入Status列,同时保留其余列的重复数据,实现宽表转长表的结构转换。
原始表格
| ID | First Name | Last Name | Date of Birth | 1/1/2022 | 2/1/2022 | 3/1/2022 | 4/1/2022 | Start Date | End Date |
|---|---|---|---|---|---|---|---|---|---|
| MO12 | Wanda | Sample | 1/1/2020 | Good | Good | Good | Good | 1/1/2022 | 1/31/2022 |
目标表格
| ID | Effective Date | First Name | Last Name | Date of Birth | Status | Start Date | End Date |
|---|---|---|---|---|---|---|---|
| MO12 | 1/1/2022 | Wanda | Sample | 1/1/2020 | Good | 1/1/2022 | 1/31/2022 |
| MO12 | 2/1/2022 | Wanda | Sample | 1/1/2020 | Good | 1/1/2022 | 1/31/2022 |
| MO12 | 3/1/2022 | Wanda | Sample | 1/1/2020 | Good | 1/1/2022 | 1/31/2022 |
| MO12 | 4/1/2022 | Wanda | Sample | 1/1/2020 | Good | 1/1/2022 | 1/31/2022 |
用户尝试的错误代码
import pandas as pd import numpy as np df = pd.read_csv(r'C:\Users\User\sample.csv') df.pivot_table(columns=['Effective Date','First Name','Last Name','Date of Birth','Status','Start Date','End Date'],values=['1/1/2022','2/1/2022','3/1/2022','4/1/2022'], aggfunc=np.max) df.head
正确实现方法
这里需要使用pd.melt()函数完成宽表转长表的操作(pivot_table适用于长表转宽表,不符合当前需求),具体代码如下:
import pandas as pd # 读取原始数据 df = pd.read_csv(r'C:\Users\User\sample.csv') # 定义不需要转换的固定列(标识列) id_columns = ['ID', 'First Name', 'Last Name', 'Date of Birth', 'Start Date', 'End Date'] # 执行宽表转长表转换 result_df = df.melt( id_vars=id_columns, var_name='Effective Date', # 将原日期列名存入该列 value_name='Status' # 将原日期列的状态值存入该列 ) # 查看转换结果 print(result_df)
代码说明
id_vars:指定转换过程中保持不变、需要重复显示的列var_name:设置存储原日期列名的新列名称(即Effective Date)value_name:设置存储原日期列状态值的新列名称(即Status)
执行上述代码后,即可得到与目标表格结构完全一致的结果。
内容的提问来源于stack exchange,提问作者weva0121
相关产品推荐
相关产品推荐

