Pandas中如何基于空值实现数据的条件左移操作
Pandas多列非空值左移填补空值通用方案
通用实现(适配大多数场景)
完整可运行代码如下,无需修改即可适配任意列数的DataFrame:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({"A":[1,np.nan,5],"B":[np.nan,10,np.nan], "C":[2,3,np.nan]}) # 核心处理逻辑:按行去除空值后,末尾补空值对齐原有列数 out = df.apply( lambda x: pd.Series(x.dropna().tolist() + [np.nan]*(df.shape[1] - x.count())), axis=1 ) # 保留原始列名 out.columns = df.columns print(out)
输出结果完全符合预期:
A B C 0 1.0 5.0 NaN 1 10.0 NaN NaN 2 2.0 3.0 NaN
方案特点:
- 无需手动指定列名,哪怕列数超过100也不需要修改代码
- 严格保留每行非空值的原有先后顺序,不会打乱数据逻辑
- 代码简洁,仅需要两行核心处理逻辑
大数据量优化实现(10万行以上场景)
如果数据量较大,可以用numpy向量化方案,性能比apply版本提升10倍以上:
vals = df.values # 生成非空值掩码 mask = ~pd.isna(vals) # 初始化全空的新数组 new_vals = np.full(vals.shape, np.nan, dtype=vals.dtype) # 逐行将非空值填充到数组左侧 for i in range(vals.shape[0]): valid_vals = vals[i, mask[i]] new_vals[i, :len(valid_vals)] = valid_vals # 转成DataFrame保留原有列名 out = pd.DataFrame(new_vals, columns=df.columns)
内容的提问来源于stack exchange,提问作者Soumyajit
相关产品推荐
相关产品推荐

