如何在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
相关产品推荐
相关产品推荐

