如何在含空值的Pandas DataFrame中将累计值转换为增量值?
问题描述
我有一个包含累计值的Pandas DataFrame,数据如下:
import pandas as pd import numpy as np data = {'Date':['2017-01-27','2017-01-28','2017-01-29','2017-01-30','2017-01-31','2017-02-01','2017-02-02','2017-02-03','2017-02-04','2017-02-05'], 'Kentucky':[1,4,5,7,np.NaN,np.NaN,10,np.NaN,12,13], 'New York':[np.NaN,2,np.NaN,7,np.NaN,np.NaN,np.NaN,np.NaN,9,np.NaN], 'California':[np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,1,np.NaN,2,np.NaN], 'Maine':[np.NaN,2,3,7,np.NaN,np.NaN,10,np.NaN,12,13]} df = pd.DataFrame(data)

如何在该含空值的DataFrame中将累计值转换为增量值?曾尝试过常规增量值转换方案,但未得到预期结果。
解决方案
核心思路是先对各列的累计值做向前填充(保留最近的有效累计值),再计算相邻行的差值,最后处理初始值和空值的情况:
- 先将
Date列转为日期类型(确保排序正确):
df['Date'] = pd.to_datetime(df['Date'])
- 对除
Date外的列,先向前填充空值,再计算增量:
# 提取数值列 numeric_cols = df.columns.drop('Date') # 向前填充最近的累计值 filled_df = df[numeric_cols].ffill() # 计算增量:当前值 - 前一行值,第一行保留原累计值(或设为0,按需调整) delta_df = filled_df.diff().fillna(filled_df) # 合并Date列和增量结果 result_df = pd.concat([df['Date'], delta_df], axis=1)
- 验证结果:以Kentucky列为例,原累计值是
[1,4,5,7,NaN,NaN,10,NaN,12,13],转换后增量为[1,3,1,2,0,0,3,0,2,1],符合预期。
如果希望空值对应的增量保持为空,而不是填充0,可以调整最后一步:
# 仅在原数据有值的位置保留增量,其余置空 delta_df = filled_df.diff().where(df[numeric_cols].notna(), np.nan) # 第一行原数据有值的位置保留原累计值 delta_df = delta_df.fillna(filled_df.where(df[numeric_cols].notna())) result_df = pd.concat([df['Date'], delta_df], axis=1)
这种情况下Kentucky列的增量为[1,3,1,2,NaN,NaN,3,NaN,2,1],更贴合原数据的空值分布。
内容的提问来源于stack exchange,提问作者Mazil_tov998
相关产品推荐
相关产品推荐

