多项目实例场景下使用pandas.wide_to_long()转换宽格式DataFrame的技术问询
可以使用
pandas.wide_to_long() 转换多项目宽格式数据! 当然可以继续用 wide_to_long() 处理这种多项目的宽格式数据,而且有两种常用的思路,不一定非要拆分数据集再合并,不过拆分法确实更直观易懂。下面分别介绍两种方法:
方法一:拆分-转换-合并(直观易懂)
这种方法先把每个项目的列单独提取出来,处理成和你之前单项目一样的结构,再分别转换后合并结果,步骤清晰,适合新手或者项目数量不多的场景。
代码示例:
import pandas as pd # 你的多项目宽格式DataFrame df_multi = pd.DataFrame( { # (粘贴你提供的多项目数据) } ) # 1. 提取并处理项目1的数据 df_project1 = df_multi.filter(like='project 1').copy() # 去掉列名里的"project 1 "前缀,还原成单项目的列名格式 df_project1.columns = df_project1.columns.str.replace('project 1 ', '', regex=False) # 添加项目标识列 df_project1['project'] = 'project 1' # 2. 提取并处理项目2的数据 df_project2 = df_multi.filter(like='project 2').copy() df_project2.columns = df_project2.columns.str.replace('project 2 ', '', regex=False) df_project2['project'] = 'project 2' # 3. 对每个项目应用你原来的wide_to_long转换逻辑 transformed_p1 = pd.wide_to_long( df_project1, stubnames=['weight_before','class','gender'], i=['name','born_on', 'estimated_at','project'], # 新增project作为标识列 j='visit', # 把原来的v改成visit更直观 sep=' ' ).dropna().droplevel(-1).reset_index() transformed_p2 = pd.wide_to_long( df_project2, stubnames=['weight_before','class','gender'], i=['name','born_on', 'estimated_at','project'], j='visit', sep=' ' ).dropna().droplevel(-1).reset_index() # 4. 合并两个项目的转换结果 final_df = pd.concat([transformed_p1, transformed_p2], ignore_index=True)
方法二:MultiIndex重塑(更简洁)
这种方法不需要拆分数据集,而是通过将列名拆分为多级索引(MultiIndex),把项目标识单独作为一级索引,再通过堆叠(stack)将项目转成行,最后应用wide_to_long转换。适合追求代码简洁性的场景。
代码示例:
import pandas as pd # 你的多项目宽格式DataFrame df_multi = pd.DataFrame( { # (粘贴你提供的多项目数据) } ) # 1. 将列名拆分为(项目标识,变量名)的多级索引 col_parts = df_multi.columns.str.split(' ', n=2) # 按空格拆分,最多拆2次 df_multi.columns = pd.MultiIndex.from_tuples( [(f'{part[0]} {part[1]}', part[2]) for part in col_parts], names=['project', 'variable'] ) # 2. 堆叠项目索引,将每个项目转成单独的行 df_stacked = df_multi.stack(level='project').reset_index() # 3. 应用wide_to_long转换,包含project作为标识列 final_df = pd.wide_to_long( df_stacked, stubnames=['weight_before','class','gender'], i=['level_0', 'name','born_on', 'estimated_at','project'], j='visit', sep=' ' ).dropna().droplevel(-1).reset_index(drop=False) # 可选:删除原来的行索引列(level_0) final_df = final_df.drop(columns=['level_0'])
最终结果说明
两种方法都会得到相同的长格式结果,包含以下列:name、born_on、estimated_at、project、weight_before、class、gender,每一行对应一个人在某个项目下的某次有效记录(无缺失值)。
你可以根据自己的习惯和项目数量选择合适的方法:如果项目很多,MultiIndex法更高效;如果想清晰看到每个步骤,拆分法更友好。
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

