如何在Python中按列求和至最后一个非0/非NaN行
实现每列求和至最后一个非0、非NaN行的方法
完全可以用Python实现,以下是具体步骤和代码:
步骤1:创建有效数据掩码
先标记DataFrame中每个元素是否为非0且非NaN的有效数据:
mask = df.ne(0) & df.notna()
步骤2:获取每列最后一个有效行的索引
通过反转行顺序,找到每列最后一个有效数据的位置(原数据中的索引):
last_valid_idx = mask.iloc[::-1].idxmax(axis=0)
注:
iloc[::-1]反转行顺序后,idxmax会找到反转后第一个有效数据的位置,也就是原数据中最后一个有效行的索引。如果某列全是0或NaN,idxmax会返回该列的第一个索引,后续求和时会处理这种情况。
步骤3:计算每列的目标求和值
遍历每列,计算从开头到最后有效行的求和:
col_sums = {} for col in df.columns: idx = last_valid_idx[col] # 检查该列是否有有效数据,没有则返回0 if not mask[col].any(): col_sums[col] = 0 else: col_sums[col] = df[col].loc[:idx].sum()
或者用更简洁的apply方式:
def sum_to_last_valid(col): valid = col.ne(0) & col.notna() if not valid.any(): return 0 last_idx = valid.iloc[::-1].idxmax() return col.loc[:last_idx].sum() col_sums = df.apply(sum_to_last_valid)
示例验证
假设你的数据和图中一致,比如size1最后一个非0非NaN的行是第5行,size2是第3行,运行上述代码后,col_sums会返回每列对应区间的求和结果。
内容的提问来源于stack exchange,提问作者sarahf
相关产品推荐
相关产品推荐

