You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项目实例场景下使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:37:26