Python Pandas数据帧减去累积列

时间:2016-11-24 12:38:51

标签: python pandas dataframe date-range

我有一些数据要导入Pandas数据帧。这些数据是累积的"并编入时间序列索引,见下文:

                        Raw data
2016-11-23 10:00:00     48.6 
2016-11-23 11:00:00     158.7 
2016-11-23 12:00:00     377.8 
2016-11-23 13:00:00     591.7 
2016-11-23 14:00:00     748.5 
2016-11-23 15:00:00     848.2 

数据每天更新,因此时间序列将每天向前移动一天。

我需要做的是获取此数据框并创建一个新列,如下所示。第一行只是复制"原始数据"柱。然后每个后续行从"原始数据"中获取数据。列,并减去它之前出现的值,例如158.7 - 48.6 = 110.1,377.8 - 158.7 = 219.1等。

有谁知道如何实现"过程数据" Python / Pandas中的专栏?

                    Raw data    Processed data
23/11/2016 10:00    48.6        48.6
23/11/2016 11:00    158.7       110.1
23/11/2016 12:00    377.8       219.1
23/11/2016 13:00    591.7       213.9
23/11/2016 14:00    748.5       156.8
23/11/2016 15:00    848.2       99.7

3 个答案:

答案 0 :(得分:6)

您可以sub使用shift ed列:

使用减法

NaN中的第一个值填写Raw data

df['Processed data'] = df['Raw data'].sub(df['Raw data'].shift())
df['Processed data'].iloc[0] = df['Raw data'].iloc[0]
print (df)
                     Raw data  Processed data
2016-11-23 10:00:00      48.6            48.6
2016-11-23 11:00:00     158.7           110.1
2016-11-23 12:00:00     377.8           219.1
2016-11-23 13:00:00     591.7           213.9
2016-11-23 14:00:00     748.5           156.8
2016-11-23 15:00:00     848.2            99.7

答案 1 :(得分:0)

您可以在Pandas中使用join执行此操作,这样做的好处是可以处理包含更多列的情况(这些列本身并不是唯一的)。

假设您有一个像

timestep                fid        cumul_value
2016-11-23 10:00:00     1          48.6 
2016-11-23 11:00:00     1          158.7 
2016-11-23 12:00:00     1          377.8 
2016-11-23 13:00:00     1          591.7 
2016-11-23 14:00:00     1          748.5 
2016-11-23 15:00:00     1          848.2 
2016-11-23 10:00:00     2          88.6 
2016-11-23 11:00:00     2          758.7 
...
2016-11-23 12:00:00     5          577.8 
2016-11-23 13:00:00     5          691.7 
2016-11-23 14:00:00     5          348.5 
2016-11-23 15:00:00     5          148.2 

这样的数据框架

其中fid代表另一个参数,其值cumul_value不同。您希望从value列中获取列cumul_value,以便value(fid,timestep) = cumul_value(fid,timestep) - cumul_value(fid,timestep - 1)为每个fid

onestep = timedelta(hours=1)
df['prev_timestep'] = df['timestep'] - onestep
df_cumul = df[['id','fid','timestep','cumul_value']]
        .set_index(['timestep','fid'])
df_val = df.join(df_cumul,on=['prev_timestep','fid'],rsuffix='_prev')
df_val['value'] = df_val['cumul_value'] - df_val['cumul_value_prev']
df_val = df_val.drop(['prev_timestep','cumul_value_prev','cumul_value','id_prev'],axis=1)

通过处理可能是特殊情况的第一个时间步长(称之为t0)来完成

df_t0 = df_cumul[df_cumul['timestep'] == t0]
df_val.loc[df_val.index.isin(df_t0.index),'value'] = df_t0['cumul_value']

答案 2 :(得分:0)

我认为您可以尝试一下,我发现很简单: 将创建一个减去值的新列。

df['processed_data'] = df['Raw_data'].diff(1)