我有一个时间序列数据库,我希望将数据分组以将它们与同一行中的另一个单元格以及先前的值进行比较。
下面的代码将针对整个数据帧返回一个向量,但是如果我尝试将其分组,则会得到一个带有apply()的数据帧以及一个带有agg或transform的错误。
样本数据帧
df = pd.DataFrame({ 'group': [1, 1, 1, 2,2,2,1,2, 1], 'target': [100,100,100,100,10,10,10,10,50],'val' :[90,80,70,4,120,6,60,8, 50] })
df
group target val
0 1 100 90
1 1 100 80
2 1 100 70
3 2 100 4
4 2 10 120
5 2 10 6
6 1 10 60
7 2 10 8
8 1 50 50
这是我尝试的功能
def spike(df):
high = df['val'] > df['target']+25
rising = df['val'] > df['val'].shift()
return high & rising
print(spike(df))
print( df.groupby('group').apply(spike))
输出
0 False
1 False
2 False
3 False
4 True
5 False
6 True
7 False
8 False
dtype: bool
0 1 2 6 8
group
1 False False False False False
2 False True False False True
这是我的输出,我试图使第二个输出看起来像第一个输出,但第6行应该为false。
答案 0 :(得分:1)
您想得太多了:
shift = df.groupby('group')['val'].shift()
df['val'].gt(df['target']+25) & df['val'].gt(shift)
输出:
0 False
1 False
2 False
3 False
4 True
5 False
6 False
7 False
8 False
dtype: bool