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

如何按优先级合并pandas DataFrame含空值的指定列

pandas按指定优先级合并多列、填充空值方法

原有代码错误原因

你之前使用的df.ffill(axis=1)['col3']不符合预期,核心原因是ffill(axis=1)会对整行所有列做从左到右的前向填充,会把sensor_name列的字符串值也纳入填充范围,最终取col3列时就会混入字符串结果,且没有限定只在col1、col2、col3三列之间按优先级取值。

正确实现方法

方法1:链式fillna(最直观,适合列数少的场景)

按照col1优先,col2补col1空值,col3补剩余空值的规则,直接链式调用fillna即可:

import numpy as np
import pandas as pd

df = pd.DataFrame({'col1': [np.NaN, 11.2, 10, np.NaN, 1000],
                   'sensor_name': ['water', 'strain', 'fog', 'water', 'fog'],
                   'col2': [np.NaN, np.NaN, 30, 40, np.NaN],
                   'col3': [np.NaN, 2, 30, 44, np.NaN]
                   })

df['new_column'] = df['col1'].fillna(df['col2']).fillna(df['col3'])
print(df)

运行输出完全匹配预期结果:

col1 sensor_name  col2  col3  new_column
0     NaN       water   NaN   NaN         NaN
1    11.2      strain   NaN   2.0        11.2
2    10.0         fog  30.0  30.0        10.0
3     NaN       water  40.0  44.0        40.0
4  1000.0         fog   NaN   NaN      1000.0

方法2:指定列做按行填充(适合多列场景)

如果需要参与优先级计算的列数较多,不想重复写fillna,可以先筛选出需要参与计算的列,排除无关列(比如这里的sensor_name),再做按行填充取第一个非空值:

# 仅选取col1、col2、col3参与计算,按行取最左侧(优先级最高)的非空值
df['new_column'] = df[['col1', 'col2', 'col3']].bfill(axis=1).iloc[:, 0]

这个写法的运行结果和方法1完全一致,原理是按行反向填充后,每行第一列(col1位置)的值就是三个列中优先级最高的非空值,三列全空的行自动保留NaN。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:15:43