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

如何在R中将宽格式DataFrame转换为长格式?

问题:宽格式DataFrame转长格式以绘制箱线图

我有一个1000行、80列的宽格式DataFrame,列名格式类似age1、age2、age3……,想要将这些列堆叠成两列(age和value)的长格式数据,用于绘制箱线图。

输入数据示例:

age1 age2 age3
x1   y1   z1
x2   y2   z2
x3   y3   z3

期望输出的长格式数据:

age value
1   x1
1   x2
1   x3
2   y1
2   y2
2   y3
3   z1
3   z2
3   z3

解决方案

用Pandas的两个工具就能实现格式转换,具体方法如下:

方法1:使用pd.melt()(通用型方法)

melt是处理宽转长的通用函数,适配绝大多数场景:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'age1': ['x1', 'x2', 'x3'],
    'age2': ['y1', 'y2', 'y3'],
    'age3': ['z1', 'z2', 'z3']
})

# 转换为长格式
long_df = pd.melt(df, var_name='age', value_name='value')
# 提取age列中的数字并转为整数类型
long_df['age'] = long_df['age'].str.extract('(\d+)').astype(int)

print(long_df)

方法2:使用pd.wide_to_long()(针对带编号的列名)

如果你的列名都是「前缀+数字」的固定格式(比如age1、age2),这个方法更简洁高效:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'age1': ['x1', 'x2', 'x3'],
    'age2': ['y1', 'y2', 'y3'],
    'age3': ['z1', 'z2', 'z3']
})
# 给原数据添加索引(转换必需)
df = df.reset_index()

# 转换为长格式
long_df = pd.wide_to_long(df, stubnames='age', i='index', j='age').reset_index(drop=True)
# 调整列名与顺序(可选,匹配期望格式)
long_df = long_df.rename(columns={'age': 'value'}).reindex(columns=['age', 'value'])

print(long_df)

转换完成后,直接用长格式DataFrame绘制箱线图即可,例如用Seaborn:seaborn.boxplot(x='age', y='value', data=long_df)。


内容的提问来源于stack exchange,提问作者Hyolim Kang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:05:22