如何基于行内首个非空值动态对pandas DataFrame执行除法运算
解决方案
易读实现(适合中小数据量)
核心思路是逐行提取首个非空值作为基准除数,再将整行数据除以该值得到剩余占比:
# 提取每行首个非空值作为基准 first_val = pivot.apply(lambda row: row.dropna().iloc[0], axis=1) # 按行计算剩余占比 retention = pivot.div(first_val, axis=0) # 可按需保留小数位,例保留3位:retention = retention.round(3)
高性能实现(适合百万级以上大数据量)
用向量化操作替代逐行遍历,运行效率更高:
# 生成非空掩码矩阵 mask = pivot.notna() # 取每行第一个非空值的列索引 first_col_idx = mask.values.argmax(axis=1) # 批量提取每行首个非空值 first_val = pivot.values[range(len(pivot)), first_col_idx] # 按行计算剩余占比 retention = pivot.div(first_val, axis=0)
效果验证
以行索引2020-02的行为例:
首个非空值为15,2020-03列值13计算得13/15≈0.87,2020-04列值8计算得8/15≈0.533,完全符合需求。
内容的提问来源于stack exchange,提问作者bellotto
相关产品推荐
相关产品推荐

