Python Pandas如何对含NaN的DataFrame计算逐行百分比差异
Pandas逐行增长率实现方案
实现逻辑
你需要的逐行增长率本质是每行中后一列相对前一列的变化率,计算公式为:(当前列值 - 前一列值) / 前一列值 * 100,仅当前列和前一列都不为空时计算,否则返回空值。可以直接用Pandas自带的pct_change方法实现。
完整代码
import pandas as pd import numpy as np # 构造示例DataFrame,你可以替换成自己的数据源 df = pd.DataFrame({ 'route': [1, 2, 3, 4], 'col1': [np.nan, 9, 68, 9], 'col2': [9, 48, 70, np.nan], 'col3': [9, np.nan, 118, 9], 'col4': [9, 118, 106, 9], 'col5': [np.nan, np.nan, np.nan, 48] }) # 提取所有需要计算的数值列 num_cols = [col for col in df.columns if col.startswith('col')] # 逐行计算增长率,乘以100后保留两位小数 growth_df = df[num_cols].pct_change(axis=1, fill_method=None).mul(100).round(2) # 拼接原route列得到最终结果 res_df = pd.concat([df['route'], growth_df], axis=1) # 输出结果 print(res_df)
输出结果
运行上述代码得到的结果和你要求的格式完全匹配:
route col1 col2 col3 col4 col5 0 1 NaN NaN 0.00 0.00 NaN 1 2 NaN 433.33 NaN NaN NaN 2 3 NaN 2.94 68.57 -10.17 NaN 3 4 NaN NaN NaN 0.00 433.33
注:第一行col4的结果和你给出的示例有差异,是因为你提供的示例原数据第一行col3、col4均为9,按公式计算结果为0,属于示例笔误。第三行col4的-10.17和你示例的-10.16为四舍五入精度差异,可通过调整
round的参数调整精度。
内容的提问来源于stack exchange,提问作者altermann
相关产品推荐
相关产品推荐

