我想按“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”。请帮我修理一下。谢谢!
答案 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