熊猫:考虑不同实体的最大值的时间范围内的总和

时间:2019-10-10 20:49:48

标签: pandas date sum time-series pandas-groupby

date        value           pointName   pointNr     connectedPoint  ownerName
2018-05-08  2.039373e+08    Miami_1     P-00068     Point_1         Owner_1
2018-05-09  2.546125e+08    Miami_1     P-00068     Point_1         Owner_1 
2018-05-09  2.546010e+08    Miami_2     P-00066     Point_1         Owner_2 
2018-05-08  2.037412e+08    Miami_2     P-00066     Point_1         Owner_2 
2018-05-09  7.142878e+08    New_York_1  P-00211     Point_2         Owner_3 
2018-05-08  6.567392e+08    New_York_1  P-00211     Point_2         Owner_3 
2018-05-08  6.567392e+08    New_York_2  P-00188     Point_2         Owner_4 
2018-05-09  7.141274e+08    New_York_3  P-00126     Point_2         Owner_2 
2018-05-09  7.142878e+08    New_York_2  P-00188     Point_2         Owner_4 
2018-05-08  6.566841e+08    New_York_3  P-00126     Point_2         Owner_2 
2018-05-08  0.000000e+00    Boston_1    P-00081     Point_3         Owner_4 
2018-05-08  0.000000e+00    Boston_2    P-00105     Point_3         Owner_5
2018-05-09  6.987462e+07    Boston_2    P-00105     Point_3         Owner_5
2018-05-09  7.000680e+07    Boston_1    P-00081     Point_3         Owner_4 

上面的片段或多或少是以下内容的结果:

rng = pd.DataFrame(my_df[['date', 'value', 'pointName', 'pointNr', 'connectedPoint', 'ownerName]].sort_values('connectedPoint').reset_index(drop=True))
rng.head(14)

我获得了全年的数据。在此示例中,我选择了两天(2018-05-08和2018-05-09)

我想计算一个时间范围内的总和(这里是两天),但是每天只计算每个connectedPoint的最大值。

2018年5月8日的伪数学写作示例:
sum(max {Point1} + max {Point2} + max {Point3})
= 2.039373e + 08 + 6.567392e + 08 +…

最后,我们将每一天(day1 + day2 + day3…)的值(即之前计算出的总和)相加,得出一个最终值。

我使用groupby尝试了不同的方法,以及以下方法的变体:

rng['date'] = pd.to_datetime(rng['date'])
rng.index = rng['date'] 
rng.resample('D').max()

对不起,我是python和pandas的新手。我在网上搜索过,但即使对于许多人来说,这里的情况很明显,我仍然找不到解决方案。我被卡住了。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用DataFrame.groupby + DataFrame.unstack

df1=df.groupby(['date','connectedPoint'])['value'].max().unstack()
print(df1)

connectedPoint      Point_1      Point_2     Point_3
date                                                
2018-05-08      203937300.0  656739200.0         0.0
2018-05-09      254612500.0  714287800.0  70006800.0

按日期获取总金额:

sum_date=df1.sum(axis=1)
print(sum_date)

date
2018-05-08    8.606765e+08
2018-05-09    1.038907e+09
dtype: float64

获取总金额:

sum_tot=sum_date.sum()
print(sum_tot)

1899583600.0