pandas如何将行内值替换为该行首个非零值 空行替换为0.0
问题解决实现
原代码存在的问题
- 空值识别失效:你为D列赋值的
""是空字符串,不属于pandas默认识别的空值类型,isnull()方法无法检测,需要先统一转换为np.nan。 - 首个非零值获取逻辑错误:
cumsum(axis=1).min(axis=1)的逻辑无法正确提取每行从左到右的第一个非零值,需要先将0值转为空值后按行取第一个有效值。 - 替换逻辑语法错误:
df.any(axis=1).replace(df, first_nonzero_df)的写法不符合replace方法的调用规则,any()返回的布尔序列无法直接替换原DataFrame的数值。
正确实现代码
import pandas as pd import numpy as np # 构造原始数据 data = { 'VOL1': [0, 21, 19, 18], 'VOL2': [1, 21, 0, 0], 'D': [3, "", 0, ""] } df = pd.DataFrame(data) # 统一空值格式,将空字符串转为np.nan df = df.replace("", np.nan) # 计算每行从左到右的第一个非零非空值 # 先把0替换为nan,按行向后填充后取第一列即为每行首个非零值 row_first_nonzero = df.replace(0, np.nan).bfill(axis=1).iloc[:, 0] # 按规则生成结果:非空位置替换为该行首个非零值,空位置替换为0.0 result = df.apply( lambda row: [row_first_nonzero[row.name] if pd.notna(val) else 0.0 for val in row], axis=1, result_type='expand' ) result.columns = df.columns # 输出结果 print(result)
输出结果验证
运行上述代码后输出结果如下,完全匹配预期:
VOL1 VOL2 D 0 1.0 1.0 1.0 1 21.0 21.0 0.0 2 19.0 19.0 19.0 3 18.0 18.0 0.0
内容的提问来源于stack exchange,提问作者silvercoder
相关产品推荐
相关产品推荐

