首页 > 解决方案 > pandas groupby 返回一个布尔向量

问题描述

我有一个时间序列数据库,我想将数据分组以将它们与同一行中的另一个单元格以及前一个值进行比较。

下面的代码将针对整个数据帧返回一个向量,但是如果我尝试对其进行分组,我会得到一个带有 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 行应该是假的。

标签: pythonpandas

解决方案


你想多了:

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

推荐阅读