2016-11-24 2 views
1

У меня есть некоторые данные, которые я импортирую в рамку данных Pandas. Эти данные «кумулятивный» и индексированный по временным рядам, смотрите ниже:Python Pandas dataframe вычесть кумулятивный столбец

     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 
+0

вам нужен столбец «Обработано данных» для сброса первого значения каждый день делать, или Должен ли он быть одним длинным потоком? – DSM

ответ

4

Вы можете использовать по sub вычитания с колонкой shift изд:

Последняя заливку 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 
+0

Спасибо. Именно то, что мне нужно. – pottolom

0

Вы можете сделать это с join в панд, которая имеет преимущество рассмотрения дел с большим количеством столбцов (которые не сами являются уникальными).

Предположим, у вас есть DataFrame как

 
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'] 
Смежные вопросы