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

如何将DataFrame中4列的非空值合并为1列?

Pandas 多列合并为单列(单条记录仅一列有值)

针对你描述的场景,这里提供两种简洁的Pandas实现方案:

方法一:使用bfill行方向填充

这种方法利用行方向的向后填充,直接提取有效数值:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'str': [10, None, None, None],
    'mpr': [None, 11, None, None],
    'cta': [None, None, 6, None],
    'mpt': [None, None, None, 1]
})

# 合并指定列到final
df['final'] = df[['str', 'mpr', 'cta', 'mpt']].bfill(axis=1).iloc[:, 0]
# 保留需要的列
df = df[['id', 'final']]
print(df)

原理说明

bfill(axis=1)会沿着每行从左到右填充空值,由于每条记录仅一列有值,填充后第一列就会保留该有效数值;如果四列全为null,填充后结果仍为null,符合需求。


方法二:使用stack过滤空值

这种方法通过将列转为行的方式自动过滤空值:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'str': [10, None, None, None],
    'mpr': [None, 11, None, None],
    'cta': [None, None, 6, None],
    'mpt': [None, None, None, 1]
})

# 合并列
df['final'] = df.set_index('id')[['str', 'mpr', 'cta', 'mpt']].stack().reset_index(level=1, drop=True)
# 重置索引并保留目标列
df = df[['id', 'final']].reset_index(drop=True)
print(df)

原理说明

stack()会将指定列转为行索引的层级,同时自动忽略空值;后续通过reset_index移除多余层级,最终匹配到对应id的有效数值。若某行四列全为空,stack后该行无对应值,final列会自动填充为null。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:10:57