首页 > 解决方案 > 带有 for 循环的 Def 函数给出错误为“'int' 类型的对象没有 len()”,'发生在索引 0'

问题描述

a = pd.DataFrame({"A":['a', 'a','b','c','a','b','c','b','c','c'],
                  "C":[0.4,0.38,0.42,0.85,0.22,0.38,0.38,0.11,0.21,0.21]})

a['B'] = a.groupby("A").cumcount()+1
a = a.sort_values(by=['A','B'])
a = a.reset_index()
a['D'] = pd.DataFrame(round(a.groupby('A')['C'].cumsum(),2))
a['E'] =""
a['F'] =""
a['J'] =""

for i in range(len(a.B)):
        if a.B[i]<=1:
            if a.D[i] <1:
                a.E[i] = 'No'
            else:
                a.E[i] = 'Yes'
        else:
            if a.D[i-1]>=1:
                a.E[i]='NA'
            else:
                if a.D[i]<1:
                    a.E[i]='No'
                else:
                    a.E[i]='Yes'
i=i+1

我在函数中定义了上述循环,但出现错误,因为“'int' 类型的对象没有 len()”,'发生在索引 0'

def five(x,y,z):
for i in range(len(x)):
    if x[i]<=1:
        if y[i]<1:
            z[i]='No'
        else:
            z[i]='Yes'
    else:
        if y[(i-1)]>=1:
            z[i]='N/A'
        else:
            if y[i]<1:
                z[i]='No'
            else:
                z[i]='Yes'

a['E'] = a.apply(lambda row: 五(row['B'],row['D'],row['E']), axis=1)

标签: pythondataframe

解决方案


当您lambdaapplywith中使用时axis=1,每一行都会传递给函数。所以在你的情况下five(...)得到一行,所以xrow['B']本质上是integera 而不是 a list

有关with的用法,请参阅本文applylambda


推荐阅读