如何在Pandas DataFrame中合并多列并清理空值(文本数值混合)
解决Pandas混合数据列合并问题
针对你要把17列含文本、百分比的混合数据(大量空值,交替出现)合并为一列,同时保留Column A的需求,直接用以下两种方法就能搞定:
方法一:用bfill逐行填充取非空值
这种方法适合每一行只有一个非空值的场景(比如你说的Column B和C交替空值),效率很高:
- 先构造示例数据(模拟你的场景):
import pandas as pd import numpy as np data = { 'Column A': ['行1', '行2', '行3', '行4'], 'Column B': ['文本1', np.nan, '30%', np.nan], 'Column C': [np.nan, '数值2', np.nan, '文本4'], # 补充剩下15列空值模拟17列的情况 **{f'Column {chr(68+i)}': [np.nan]*4 for i in range(15)} } df = pd.DataFrame(data)
- 执行合并操作:
# 选中要合并的17列(排除Column A) merge_columns = df.columns.drop('Column A') # 逐行从左到右填充空值,取每一行的第一个非空值作为新列 df['新Column B'] = df[merge_columns].bfill(axis=1).iloc[:, 0] # 保留需要的列,删除原17列 df = df[['Column A', '新Column B']]
方法二:逐行聚合取第一个非空值
如果担心某些行存在多个非空值(你场景里应该没有),可以用这种更严谨的方式,只取每行第一个非空值:
merge_columns = df.columns.drop('Column A') df['新Column B'] = df[merge_columns].agg( lambda row: row.dropna().iloc[0] if not row.dropna().empty else np.nan, axis=1 ) df = df[['Column A', '新Column B']]
补充说明
- 两种方法都能保留原数据格式(不管是文本还是百分比字符串),不会因为混合类型报错;
- 如果有行所有17列都是空值,新列会显示
NaN,可以用df['新Column B'] = df['新Column B'].fillna('无数据')替换成你需要的默认值;
内容的提问来源于stack exchange,提问作者penguinslide
相关产品推荐
相关产品推荐

