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

