熊猫:如何在groupby之后填充缺少的差异值?

时间:2018-08-08 13:25:10

标签: python pandas pandas-groupby

我使用 Pandas.groupby 对一组数据进行分组。

然后我要计算delta value,该值由每个组的 first 元素与下一个分组的 first 元素之间的差给出: / p>

import pandas as pd
import numpy as np
import datetime

# dummy set of data
np.random.seed(0)
SIZE = 25
dt = pd.date_range(datetime.datetime(2018,1,1,10,14,30), freq="1Min", periods=SIZE)
wa = (np.random.random(size=SIZE)-.4)*1000
wa = np.cumsum(wa) + 10000
df = pd.DataFrame({"dtime":dt, "value":wa}).set_index("dtime")

grouped = df.groupby(pd.Grouper(freq='15Min'))

print("\n************\nDataframe:")
print df

print("\n************\nFirst value of each group:")
print(grouped.first())

print("\n************\nDelta value:")
print(-grouped.first().diff(periods=-1))  

此代码返回:

************
Dataframe:
                            value
dtime                            
2018-01-01 10:14:30  10148.813504
2018-01-01 10:15:30  10464.002870
2018-01-01 10:16:30  10666.766246
2018-01-01 10:17:30  10811.649429
2018-01-01 10:18:30  10835.304229
....
2018-01-01 10:34:30  14209.714833
2018-01-01 10:35:30  14608.873397
2018-01-01 10:36:30  14670.352759
2018-01-01 10:37:30  15050.881935
2018-01-01 10:38:30  14769.156361

************
First value of each group:
                            value
dtime                            
2018-01-01 10:00:00  10148.813504
2018-01-01 10:15:00  10464.002870
2018-01-01 10:30:00  12350.307746

************
Delta value:
                           value
dtime                           
2018-01-01 10:00:00   315.189366
2018-01-01 10:15:00  1886.304875
2018-01-01 10:30:00          NaN   <===== Here is my problem

最后一个增量当然是NaN,因为没有下一个计算差异的组。

是否可以用最后一组的第一个和最后一个值之间的差异填充此NaN

作为最后一行2018-01-01 10:38:30 14769.156361,它应该返回:

************
Delta value:
                           value
dtime                           
2018-01-01 10:00:00   315.189366
2018-01-01 10:15:00  1886.304875
2018-01-01 10:30:00  2418.848615

谢谢

1 个答案:

答案 0 :(得分:0)

当然,只要我问了我就找到了答案。我将其留给其他用户使用。很明显...

delta = -grouped.first().diff(periods=-1)
delta = delta.fillna(grouped.last() - grouped.first())

print(delta)