Python Pandas 数据框减去累积列
Python Pandas dataframe subtract cumulative column
我有一些数据要导入到 Pandas 数据框中。此数据是 "cumulative" 并按时间序列编入索引,见下文:
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
数据每天更新,所以时间序列每天都会向前移动一天。
我需要做的是获取此数据框并创建一个新列,如下所示。第一行只是复制 "Raw data" 列中的数据。然后每个后续行都从 "Raw data" 列中获取数据,并减去它之前出现的值,例如158.7 - 48.6 = 110.1, 377.8 - 158.7 = 219.1, 等等
有谁知道我如何才能实现 Python/Pandas 中 "Process data" 列中的内容?
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
根据 Raw data
中的第一个值最后填充 NaN
。
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
您可以在 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
的 DataFrame
其中 fid
表示另一个参数,其值 cumul_value
变化。您想要从 cumul_value
列中获取一个 value
列,使得每个 fid
.
的 value(fid,timestep) = cumul_value(fid,timestep) - cumul_value(fid,timestep - 1)
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']
我想你可以试试这个,我觉得很简单:
将创建一个具有减去值的新列。
df['processed_data'] = df['Raw_data'].diff(1)
我有一些数据要导入到 Pandas 数据框中。此数据是 "cumulative" 并按时间序列编入索引,见下文:
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
数据每天更新,所以时间序列每天都会向前移动一天。
我需要做的是获取此数据框并创建一个新列,如下所示。第一行只是复制 "Raw data" 列中的数据。然后每个后续行都从 "Raw data" 列中获取数据,并减去它之前出现的值,例如158.7 - 48.6 = 110.1, 377.8 - 158.7 = 219.1, 等等
有谁知道我如何才能实现 Python/Pandas 中 "Process data" 列中的内容?
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
根据 Raw data
中的第一个值最后填充 NaN
。
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
您可以在 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的 DataFrame
其中 fid
表示另一个参数,其值 cumul_value
变化。您想要从 cumul_value
列中获取一个 value
列,使得每个 fid
.
value(fid,timestep) = cumul_value(fid,timestep) - cumul_value(fid,timestep - 1)
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']
我想你可以试试这个,我觉得很简单: 将创建一个具有减去值的新列。
df['processed_data'] = df['Raw_data'].diff(1)