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

如何在Pandas中通过列堆叠实现DataFrame行扩展?

这是个典型的宽表转长表需求,针对大数据量和多组y列的场景,Pandas里有几个高效的内置方法,完全能满足你的要求,我给你一步步拆解:

首先先还原你的示例数据:

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3], [4, 5, np.nan]], columns=['x', 'y1', 'y2'])

方法1:用pd.melt()(简洁直观,适合明确指定列的场景)

melt是Pandas专门为宽转长设计的函数,矢量化处理效率拉满,代码也清晰:

# 把y1、y2转成单列,保留x的对应关系
melted = df.melt(id_vars='x', value_vars=['y1', 'y2'], value_name='y')
# 过滤掉y为NaN的行,删掉不需要的原列名列,重置索引
result = melted.dropna(subset=['y']).drop(columns='variable').reset_index(drop=True)

如果你的y列特别多(比如y1到y100),不用手动列出来,直接自动筛选:

# 自动抓取所有以y开头的列
y_cols = [col for col in df.columns if col.startswith('y')]
# 或者用filter更省事
y_cols = list(df.filter(like='y').columns)

# 再套用上面的逻辑
result = df.melt(id_vars='x', value_vars=y_cols, value_name='y').dropna(subset=['y']).drop(columns='variable').reset_index(drop=True)

方法2:用stack()(更简洁,自动跳过NaN)

stack也是处理这类转换的高效工具,而且它会自动忽略NaN值,省掉一步过滤操作:

# 把x设为索引,stack所有非索引列(也就是y1、y2),再还原成常规结构
result = df.set_index('x').stack().reset_index(name='y').drop(columns='level_1').reset_index(drop=True)

运行任意一种方法后,你都会得到想要的结果:

x  y
0  1  2
1  1  3
2  4  5

这两个方法都是Pandas的内置矢量化操作,完全不需要写循环,处理大数据量的时候速度比手动循环快几个数量级,不管你有多少组y列都能轻松应对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:38:04