【问题标题】:Obtaining max and sum values for diffrerent sub sets in a data frame. Also plotting each subset获取数据帧中不同子集的最大值和总和值。还绘制每个子集
【发布时间】:2017-02-08 17:03:44
【问题描述】:

我有一个数据框“事件”,如图所示:

              DateTime        ModFlow(cfs)     ObsFlow(cfs)  ModVol(f3)   ObsVol(f3)
Event
Event 1     8/15/2016 15:35   11.85926          0           0.039530867   0
Event 1     8/15/2016 10:05   30.05923          0           0.100197433   0
Event 1     8/15/2016 10:00   31.10118          0           0.1036706     0
Event 1     8/15/2016 9:55    32.17444          0           0.107248133   0
Event 1     8/15/2016 4:10    0.6783166      0.5650155      0.002261055   0.001883385
Event 10    6/23/2016 4:35    0.5573569      0.4814242      0.001857856   0.001604747
Event 10    6/23/2016 4:40    0.5536903      0.3544892      0.001845634   0.001181631
Event 10    6/23/2016 4:45    0.5502114      0.368421       0.001834038   0.00122807
Event 10    6/23/2016 4:50    0.5698021      0.501548       0.00189934    0.001671827
Event 10    6/23/2016 4:55    0.7525368      0.879257       0.002508456   0.002930857
Event 11    6/10/2016 8:05    0.6593155      0.6145511      0.002197718   0.002048504
Event 11    6/10/2016 8:10    0.6621117      0.8405573      0.002207039   0.002801858
Event 11    6/10/2016 8:15    0.6578091      0.8173375      0.002192697   0.002724458
Event 11    6/10/2016 8:20    0.6581948      0.871517       0.002193983   0.002905057
Event 12    4/26/2016 22:00   2.307288       2.588235       0.00769096    0.00862745
Event 12    4/26/2016 22:05   2.366998       3.091331       0.007889993   0.010304437
Event 12    4/26/2016 22:10   2.494073       3.278638       0.008313577   0.010928793
Event 12    4/26/2016 22:15   2.746868       3.083591       0.009156227   0.010278637
Event 12    4/26/2016 22:20   3.146326       2.877709       0.010487753   0.009592363
Event 12    4/26/2016 22:30   4.090476       2.354489       0.01363492    0.007848297

Q1) 我如何获取每个事件的 ModFlow(cfs) 和 ObsFlow(cfs) 的最大值,以及每个事件的 ObsFlow(cfs) 列和 ObsVol(f3) 列的总和到一个新的数据帧中?

所需的输出格式:

              DateTime        Peak ModFlow(cfs)     Peak ObsFlow(cfs)  Total ModVol(f3)   Total ObsVol(f3)
Event
Event 1     8/15/2016 15:35           -                 -                -                  -
Event 2     8/15/2016 10:05           -                 -                -                  -
Event 3     8/15/2016 10:00           -                 -                -                  -
Event 4     8/15/2016 9:55            -                 -                -                  -
Event 5     8/15/2016 4:10            -                 -                -                  -       

另外,我如何绘制“事件”数据框,以便为每个事件获得单独的图?

【问题讨论】:

  • 我只知道使用 .sum() 和 .idxmax() 函数,但不知道如何分别为每个事件执行此操作。

标签: python pandas dataframe


【解决方案1】:

我认为您需要 aggregate by firstmaxsum

df1 = df.groupby(level=0)
        .agg({'DateTime':'first',
              'ModFlow(cfs)':'max',
              'ObsFlow(cfs)':'max',
              'ModVol(f3)':'sum',
              'ObsVol(f3)':'sum'})

#set order of columns
df1 = df1.reindex(columns=['DateTime','ModFlow(cfs)','ObsFlow(cfs)',
                           'ModVol(f3)','ObsVol(f3)'])

df1.columns = ['DateTime','Peak ModFlow(cfs)','Peak ObsFlow(cfs)',
               'Total ModVol(f3)','Total ObsVol(f3)']
print (df1)
                 DateTime  Peak ModFlow(cfs)  Peak ObsFlow(cfs)  \
Event                                                             
Event 1   8/15/2016 15:35           0.565016          32.174440   
Event 10   6/23/2016 4:35           0.879257           0.752537   
Event 11   6/10/2016 8:05           0.871517           0.662112   
Event 12  4/26/2016 22:00           3.278638           4.090476   

          Total ModVol(f3)  Total ObsVol(f3)  
Event                                         
Event 1           0.001883          0.352908  
Event 10          0.008617          0.009945  
Event 11          0.010480          0.008791  
Event 12          0.057580          0.057173 

然后如果需要DataFrame.plot.bar:

df1.plot.bar()

对于第一个DataFrame

df.groupby(level=0).apply(lambda x: x.plot.bar()) 

【讨论】:

  • 非常感谢。但是在我的实际数据中,我有 47 个事件。列顺序已更改。我在 Total ModVol(f3) 列中获取日期时间值。好像全部互换了。有什么问题?
  • 有问题dict 无法订购。给我一秒。
  • 我有一个问题。 (level=0) 这里有什么用?
  • 因为如果可以按索引分组,请使用level=0df.index
  • 嗨。回到这个问题,Peak ModFlow(cfs) 发生在一个日期时间,而 Peak ObsFlow(cfs) 发生在每个事件的不同日期时间。音量也是如此。如何获取对应的日期时间?
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
相关资源
最近更新 更多