如何对三角结构Pandas DataFrame计算指定方向的cumprod累乘
实现DataFrame从右向左跳过NaN的累乘
你原有代码未生效的核心原因是:如果未显式指定skipna=True,部分pandas版本遇到NaN值会终止累乘,全部返回NaN;其次默认累乘后会将NaN位置也填充为计算结果,需要保留原DataFrame的NaN位置规则。
完整实现代码如下:
import pandas as pd import numpy as np # 构造示例数据 data = [ [np.nan, np.nan, 2.5, 6.5, np.nan, np.nan], [np.nan, 5.32, 6.3, np.nan, np.nan, np.nan], [np.nan, 9.4, 5.6, np.nan, np.nan, np.nan], [4.5, np.nan, 5.6, np.nan, np.nan, np.nan], [np.nan, 6.5, 4.3, np.nan, np.nan, np.nan], [5.3, np.nan, np.nan, np.nan, np.nan, np.nan] ] df1 = pd.DataFrame(data, index=['2016A', '2016B', '2017A', '2018B', '2018C', '2019A']) # 核心处理逻辑 # 倒序列后做行方向累乘,再把列顺序倒回,显式指定跳过NaN df_temp = df1.iloc[:, ::-1].cumprod(axis=1, skipna=True).iloc[:, ::-1] # 仅保留原df中非NaN位置的计算结果,其余位置恢复为NaN df2 = df_temp.where(df1.notna(), np.nan)
执行后输出的df2和你期望的结果完全匹配,小数精度差异可按需用round()方法调整。
内容的提问来源于stack exchange,提问作者Michael Scofield
相关产品推荐
相关产品推荐

