Python中如何为np.diff设置参考点,处理带时间戳数据集且保留原数据结构
如何为带时间戳的DataFrame添加自定义初始参考点的差分列?
我有一个带时间戳的数据集,代码如下:
import pandas as pd data = pd.DataFrame({'date': pd.to_datetime(['1992-01-01', '1992-02-01', '1992-03-01', '1992-04-01', '1992-05-01']), 'sales': [10, 20, 30, 40, 50], 'price': [4302, 4323, 4199, 4397, 4159]})我尝试使用
np.diff(data['price'])对price列进行差分运算,但希望为时间戳为1992-01-01的第一行设置参考点,参考值为4100,期望得到如下数据集:date, sales, diff_price 1992-01-01, 10, 4302-4100 1992-02-01, 20, 4323-4302 1992-03-01, 30, 4199-4323 1992-04-01, 40, 4397-4199 1992-05-01, 50, 4159-4397请问有没有符合Python风格的简便方法可以实现该需求,且不改变原数据的结构?
当然有!用Pandas本身的方法就能优雅解决这个问题,完全不需要复杂操作,还能保证原数据结构丝毫不改动。下面给你两种简洁的实现方式:
方法一:构造基准序列做差(最直观)
核心思路是先创建一个包含初始参考值的基准序列,再直接和原price列做减法:
import pandas as pd data = pd.DataFrame({'date': pd.to_datetime(['1992-01-01', '1992-02-01', '1992-03-01', '1992-04-01', '1992-05-01']), 'sales': [10, 20, 30, 40, 50], 'price': [4302, 4323, 4199, 4397, 4159]}) # 构造基准值:第一个元素是参考值4100,后面跟着price列的前4个值 base_values = [4100] + data['price'].tolist()[:-1] # 新增diff_price列,计算当前price与对应基准值的差 data['diff_price'] = data['price'] - base_values
方法二:利用diff()补全初始值
如果你习惯用diff()方法计算常规差分,也可以先得到后续行的差值,再手动替换掉第一行的缺失值:
# 计算常规差分,第一行会得到NaN diff_results = data['price'].diff() # 替换第一行的NaN为初始参考差值 diff_results.iloc[0] = data['price'].iloc[0] - 4100 # 将结果添加为新列 data['diff_price'] = diff_results
验证结果
运行任意一种方法后,查看data都会得到符合你预期的结果:
date sales price diff_price 0 1992-01-01 10 4302 202 1 1992-02-01 20 4323 21 2 1992-03-01 30 4199 -124 3 1992-04-01 40 4397 198 4 1992-05-01 50 4159 -238
两种方法都不会改动原DataFrame的索引、列顺序或其他数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user3104352




