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

如何在R中将宽格式DataFrame转为长格式(堆叠多列值)

解决方案:宽格式DataFrame转长格式并剔除NA值

用Pandas的melt()方法就能轻松实现需求,步骤如下:

1. 构造示例数据

先模拟你提到的带NA值的宽格式DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ID': ['ID1', 'ID2'],
    'Value1': ['xxx', 'xxx'],
    'Value2': ['yyy', 'yyy'],
    'Value3': ['zzz', np.nan]
})

2. 转换为长格式并剔除NA

# 宽转长:指定ID为保留列,Value1/2/3为需要展开的列
long_df = df.melt(
    id_vars='ID',  # 保持不变的标识列
    value_vars=['Value1', 'Value2', 'Value3'],  # 要转换为行的列
    var_name='Value_Type',  # 原列名对应的新列名(可选,不需要可以后续删除)
    value_name='Values'  # 存储值的列名
)

# 剔除Values列的NA值
long_df = long_df.dropna(subset=['Values'])

# (可选)如果不需要Value_Type列,直接删除
long_df = long_df.drop(columns='Value_Type')

执行后得到的结果就是每个ID对应多行有效值,比如ID1会有3行(xxx、yyy、zzz),ID2只有2行(xxx、yyy)。

替代方案:使用wide_to_long()

如果你的Value列命名规则统一(比如都是Value+数字),也可以用wide_to_long():

long_df = pd.wide_to_long(df, stubnames='Value', i='ID', j='Seq').reset_index()
long_df = long_df.dropna(subset=['Value']).rename(columns={'Value': 'Values'})

这个方法更简洁,但要求列名有统一的前缀(这里是Value),后缀是序列数字。

内容的提问来源于stack exchange,提问作者Leah Robinson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:31