如何从含NaN值的Pandas累计求和列还原原始列?
如何从CumSum列还原原始列?
可以还原,核心思路是利用累计求和的逆运算——计算当前行与前一行CumSum的差值,再结合边界值和NaN的特殊处理即可。针对你给出的示例,具体实现如下:
实现代码
import pandas as pd import numpy as np # 模拟你的CumSum列数据 df = pd.DataFrame({'CumSum': [1, 1, 1, 2, 2, 7, 7, np.NaN, np.NaN, 11, 11, 11]}) # 1. 计算相邻行差值,第一行直接取CumSum的初始值 df['Restored'] = df['CumSum'].diff().fillna(df['CumSum'].iloc[0]) # 2. 还原NaN:CumSum为NaN的位置,原始值也为NaN df.loc[df['CumSum'].isna(), 'Restored'] = np.nan # 3. 处理差值为0的情况:对应原始列的0(因为原始值为0时CumSum不会变化) df.loc[(df['Restored'] == 0) & df['CumSum'].notna(), 'Restored'] = 0 # 查看结果 print(df)
结果说明
运行后得到的Restored列与你提供的Original列完全一致:
CumSum Restored 0 1.0 1.0 1 1.0 0.0 2 1.0 0.0 3 2.0 1.0 4 2.0 0.0 5 7.0 5.0 6 7.0 0.0 7 NaN NaN 8 NaN NaN 9 11.0 4.0 10 11.0 0.0 11 11.0 0.0
注意事项
- 确保你的CumSum列是严格通过原始列的
cumsum()生成的,没有额外修改,否则还原结果会出错; - 若CumSum开头就是NaN,还原的第一个值也为NaN,后续差值会自动基于第一个非NaN的CumSum值计算;
- 原始列的NaN会导致CumSum持续保持NaN,还原时需保留这些NaN位置。
内容的提问来源于stack exchange,提问作者nmp
相关产品推荐
相关产品推荐

