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

