如何按条件填充Pandas DataFrame:行中出现0.00后后续值置0
解决方案:按条件填充Pandas DataFrame
问题描述
现有如下DataFrame:
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 0.32 | 0.40 | 0.60 | 1.20 | 3.40 | 0.00 |
| 0.17 | 0.12 | 0.00 | 1.30 | 2.42 | 0.00 |
| 0.31 | 0.90 | 0.80 | 1.24 | 4.35 | 0.00 |
| 0.39 | 0.00 | 0.90 | 1.50 | 1.40 | 0.00 |
需求:若某行中出现0.00,将该行从第一个0.00出现的位置到末尾的所有值置为0.00,处理后结果如下:
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 0.32 | 0.40 | 0.60 | 1.20 | 3.40 | 0.00 |
| 0.17 | 0.12 | 0.00 | 0.00 | 0.00 | 0.00 |
| 0.31 | 0.90 | 0.80 | 1.24 | 4.35 | 0.00 |
| 0.39 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
可行代码实现
利用Pandas向量化操作,无需循环即可高效完成需求:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame([ [0.32, 0.40, 0.60, 1.20, 3.40, 0.00], [0.17, 0.12, 0.00, 1.30, 2.42, 0.00], [0.31, 0.90, 0.80, 1.24, 4.35, 0.00], [0.39, 0.00, 0.90, 1.50, 1.40, 0.00] ]) # 生成掩码:标记哪些位置需要保留原值 mask = df.ne(0).astype(int).cumprod(axis=1) # 掩码与原数据相乘,得到目标结果 result = df * mask print(result)
代码逻辑说明
df.ne(0):判断每个元素是否非0,返回布尔值DataFrame.astype(int):将布尔值转为整数(True→1,False→0).cumprod(axis=1):对每行做累积乘积,第一个0出现的位置及之后的所有值都会变为0(0乘以任何数都是0)- 原DataFrame与掩码相乘,保留第一个0之前的原值,之后的全部置0
原代码问题分析
你之前尝试的循环代码存在逻辑缺陷:
- 仅通过前一列是否为0来设置当前列,没有覆盖“第一个0之后所有列都置0”的需求
- 循环范围
range(1,T-1)未处理完整的行和列,无法实现全局条件判断
内容的提问来源于stack exchange,提问作者Boom
相关产品推荐
相关产品推荐

