【问题标题】:Python Pandas dataframe subtract cumulative columnPython Pandas 数据框减去累积列
【发布时间】:2016-11-24 12:38:50
【问题描述】:

我有一些数据要导入到 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

【问题讨论】:

  • 您需要每天将“已处理数据”列重置为第一个值,还是应该是一个长流?

标签: python pandas dataframe date-range


【解决方案1】:

您可以使用sub 的减法和shifted 列:

最后用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

【讨论】:

    【解决方案2】:

    我想你可以试试这个,我觉得很简单: 将创建一个减去值的新列。

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

    【讨论】:

      【解决方案3】:

      您可以在 Pandas 中使用join 来执行此操作,它的优点是可以处理更多列(它们本身不是唯一的)。

      假设你有一个像

      这样的 DataFrame 时间步长 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 会有所不同。您想从cumul_value 列中获取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']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2013-02-12
        • 1970-01-01
        相关资源
        最近更新 更多