将函数应用于列表时,会出现“TypeError:'Int64Index'对象不可调用”

时间:2013-11-22 14:23:50

标签: python pandas

我想按“objid”进行分组,并在同一个id中获得第一个NONE-ZERO级别。如果在同一个列表中,所有级别为0,我将返回2.我所做的是:

objid   level    color
1        0        red
1        1        blue
1        2        yellow
2        0        white
3        1        red

结果:

objid  level    
1       1        
2       2        
3       1  

def titleNot0(ls):
    try:
        Not0= ls.index(filter(lambda x:x!=0,ls)[0])
        return ls[Not0]
    except IndexError:
        return 2
userTitle = JobData.groupby("candidate_id")["TitleLevel"].apply(titleNot0)

我尝试了一些简单的列表,例如:x=[0,1,2], titleNot0(x)。有用。但是如果我将该函数应用于groupby,它将返回“TypeError”。请帮我修理一下。谢谢!

1 个答案:

答案 0 :(得分:2)

错误在于行ls.index(filter(lambda x:x!=0,ls)[0])

filter(lambda x:x!=0,ls)[0]的结果等于1,而ls.index(1)是无效的表达式。这是因为ls是Series对象而Series.index不可调用,与您工作案例中的list.index相反。

要适用于DataFrame,请将您的功能修改为

def titleNot0(ls):
    try:
        return filter(lambda x:x!=0,ls)[0]
    except IndexError: 
        return 2

并以

调用
>>> df = pd.DataFrame([[1,1,1,2,3],[0,1,2,0,1]]).T
>>> df.columns = list('AB')
>>> df.groupby('A')['B'].agg(titleNot0)
A
1    1
2    2
3    1
Name: B, dtype: int64