我已经做了一个函数,它使用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是可能的吗?哪里需要一个不同的方法?非常感谢
1条答案
按热度按时间wdebmtf21#
这个函数可以工作,但我需要使用groupby将它应用到表中的所有名称。
看起来您没有执行聚合;你在进行一个一个项目的转换。因此,不要使用
GroupBy.apply()
,使用GroupBy.transform()
。转换函数需要接受一个
Series
作为输入,因此您应该修改PFunc1
以接受一个参数。此外,
PFunc1
可以稍微简化:np.where
scores.shift(+1) < 0
是否