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

如何将DataFrame中y1-y4列合并为y列并标注来源列

合并DataFrame多列为单列并标注来源列

现有一个Pandas DataFrame,其中y1至y4列的每一行仅有一个有效值,其余为NaN:

x        y1        y2          y3           y4   
0  -17.7 -0.785430       NaN         NaN          NaN 
1  -15.0       NaN       NaN         NaN -3820.085000 
2  -12.5       NaN       NaN    2.138833          NaN 

需要将所有y列合并为一列y,同时新增一列no标注该值所属的原y列,期望输出:

x             y       no   
0  -17.7     -0.785430       y1
1  -15.0  -3820.085000       y4
2  -12.5      2.138833       y3

解决方案

方法一:使用stack()(推荐,适配每行仅一个有效值的场景)

stack()会自动过滤NaN值,直接将列索引转为行索引,操作高效:

import pandas as pd

# 构造示例数据(实际使用时替换为你的DataFrame)
df = pd.DataFrame({
    'x': [-17.7, -15.0, -12.5],
    'y1': [-0.785430, pd.NA, pd.NA],
    'y2': [pd.NA, pd.NA, pd.NA],
    'y3': [pd.NA, pd.NA, 2.138833],
    'y4': [pd.NA, -3820.085000, pd.NA]
})

# 执行合并
result = df.set_index('x').stack().reset_index()
# 重命名列
result.columns = ['x', 'no', 'y']
# 调整列顺序匹配期望输出
result = result[['x', 'y', 'no']]

print(result)

方法二:使用melt() + dropna()

如果需要更灵活的列选择,可使用melt()将宽表转长表,再过滤空值:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'x': [-17.7, -15.0, -12.5],
    'y1': [-0.785430, pd.NA, pd.NA],
    'y2': [pd.NA, pd.NA, pd.NA],
    'y3': [pd.NA, pd.NA, 2.138833],
    'y4': [pd.NA, -3820.085000, pd.NA]
})

# 转长表并过滤空值
result = df.melt(id_vars='x', var_name='no', value_name='y').dropna(subset=['y'])
# 重置索引并调整列顺序
result = result[['x', 'y', 'no']].reset_index(drop=True)

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:10:20