numpy 将Groupby与np.where函数一起应用以检测模式

zzlelutf  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(141)

我已经做了一个函数,它使用np. where在数据框架中查找一个系列的模式。该函数查找一系列三个<0的值,其中每个值都小于前一个值。如果第4个值大于第3个值,则函数返回1。这个函数可以工作,但我需要使用groupby将它应用到表中的所有名称。
下面是工作代码:

import pandas as pd
import numpy as np
def PFunc1():
    val = np.where((
        (df1['Score'].shift(+3)<0) &
        (df1['Score'].shift(+1)<0) &
        (df1['Score'].shift(+2) < df1['Score'].shift(+3)) & 
        (df1['Score'].shift(+1) < df1['Score'].shift(+2)) & 
        (df1['Score'] > df1['Score'].shift(+1))),1,0)
    return val

df1 = pd.DataFrame()
df1['Name'] = ['A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A',
               'B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B']
df1['Score'] = np.random.randint(-4,3,df1.shape[0])
df1['Pattern'] = PFunc1()
df1.head(50)

当我运行下面的命令时,我得到了一个错误:TypeError:unhashable type:'numpy.ndarray'将相同的方法应用于Lambda函数会导致Nans。

df1['Pattern2'] = df1.groupby('Name')['Score'].apply(PFunc1())

这与np是可能的吗?哪里需要一个不同的方法?非常感谢

wdebmtf2

wdebmtf21#

这个函数可以工作,但我需要使用groupby将它应用到表中的所有名称。
看起来您没有执行聚合;你在进行一个一个项目的转换。因此,不要使用GroupBy.apply(),使用GroupBy.transform()
转换函数需要接受一个Series作为输入,因此您应该修改PFunc1以接受一个参数。
此外,PFunc1可以稍微简化:

  • 不需要np.where
  • 您不需要检查scores.shift(+1) < 0是否
  • (如果第一项小于0,并且接下来的两项甚至小于第一项,则不需要检查它们是否也小于0。
import pandas as pd
import numpy as np

def PFunc1(scores):
    return (
        (scores.shift(+3)<0) &
        (scores.shift(+2) < scores.shift(+3)) &
        (scores.shift(+1) < scores.shift(+2)) &
        (scores > scores.shift(+1))
    ).astype(int)

df1 = pd.DataFrame()
df1['Name'] = ['A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A','A',
               'B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B','B']
df1['Score'] = np.random.randint(-4,0,df1.shape[0])

# Process all Scores without respect to Name
df1['Pattern'] = PFunc1(df1['Score'])

# Process Scores for each Name independently
df1['Pattern2'] = df1.groupby('Name')['Score'].transform(PFunc1)

相关问题