如何用Python Pandas从三列中选取首个非空值生成新列
在Pandas DataFrame中提取指定列的首个非空值到新列
嘿,这个需求处理起来很简单,我给你两种实用的实现方式,分别适配不同场景:
方法一:向量化操作(推荐,适合大数据集)
这种方式用Pandas的内置向量化方法,速度快效率高,是处理这类问题的首选方案。
步骤:
- 先导入需要的库,并构造示例数据(注意Pandas里用
np.nan表示空值):
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'name': ['Tom', 'John', 'Lily'], 'homePhone': [888, np.nan, np.nan], 'workPhone': [666, 777, np.nan], 'CellPhone': [np.nan, np.nan, 333] } df = pd.DataFrame(data)
- 核心逻辑:选中目标三列后,沿行方向(
axis=1)执行向后填充(bfill),这样每行的首个非空值会被填充到该列组的第一列位置,最后提取这一列的值即可:
# 生成'I want'列 df['I want'] = df[['homePhone', 'workPhone', 'CellPhone']].bfill(axis=1).iloc[:, 0]
方法二:逐行处理(直观易理解,适合小数据集)
如果你更看重代码的可读性,也可以用apply逐行处理,精准定位每行的第一个非空值:
df['I want'] = df[['homePhone', 'workPhone', 'CellPhone']].apply( lambda row: row[row.first_valid_index()], axis=1 )
两种方法运行后,你都会得到符合预期的结果:
| name | homePhone | workPhone | CellPhone | I want |
|---|---|---|---|---|
| Tom | 888.0 | 666.0 | NaN | 888.0 |
| John | NaN | 777.0 | NaN | 777.0 |
| Lily | NaN | NaN | 333.0 | 333.0 |
补充提示:如果某行的三列全为空,两种方法都会生成
NaN,你可以根据需求用fillna()补充自定义默认值。
内容的提问来源于stack exchange,提问作者NewHill
相关产品推荐
相关产品推荐

