Python 类型错误:Dataframe应用函数,参数传递
默认情况下,列都设置为零。 在URL列上存在列名字符串的位置(行、列)将条目设为1 L#列表,其中包含用于检查是否在URL上找到的列名 我是初学者,它会抛出错误: /f(x)中的usr/local/lib/python3.6/dist-packages/pandas/core/series.pyPython 类型错误:Dataframe应用函数,参数传递,python,pandas,dataframe,data-science,Python,Pandas,Dataframe,Data Science,默认情况下,列都设置为零。 在URL列上存在列名字符串的位置(行、列)将条目设为1 L#列表,其中包含用于检查是否在URL上找到的列名 我是初学者,它会抛出错误: /f(x)中的usr/local/lib/python3.6/dist-packages/pandas/core/series.py 4195 4196 def f(x): ->4197返回函数(x,*args,**kwds)4198 4199其他: TypeError:generate()接受2个位置参数,但给出了9个 任何建议都
4195 4196 def f(x): ->4197返回函数(x,*args,**kwds)4198 4199其他: TypeError:generate()接受2个位置参数,但给出了9个 任何建议都会有帮助 编辑1: 之后,
df3[col].apply(generate, args=(col,))
出现错误:
> --------------------------------------------------------------------------- AttributeError Traceback (most recent call
> last) <ipython-input-162-508036a6e51f> in <module>()
> 1 for col in L:
> ----> 2 df3[col].apply(generate, args=(col,))
>
> 2 frames pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
>
> <ipython-input-159-9380ffd36403> in generate(statement, col)
> 1 def generate(statement,col):
> ----> 2 if statement.find(col) == -1:
> 3 return 0
> 4 else:
> 5 return 1
>
> AttributeError: 'int' object has no attribute 'find'
谢谢大家的支持 创建一个1元素元组时,元素后面需要一个逗号:args=(col,),否则括号将被忽略。在
args
中传递参数似乎有问题<apply
函数中的code>args将把输入作为元组,并将元组传递给函数
让我们看一个例子来描述它
df = pd.DataFrame([['xyz', 'US'],['abc', 'MX'],['xyz', 'CA']], columns = ["Name", "Country"])
print(df)
Name Country
xyz US
abc MX
xyz CA
根据需要创建一个带有额外参数的函数
def generate(statement,col):
if statement.find(col) == -1:
return 0
else:
return 1
将L作为列表,['Name','Country']
现在,让我们在循环中应用带有额外参数的函数generate
for col in L:
print(df[col].apply(generate, args=(col)))
TypeError: generate() takes 2 positional arguments but 5 were given
现在,我们可以看到发生错误的原因是(col)
是元组中的单个元素,因此args将以args=('N','a','M','E')的形式接受输入。
。与语句一起
现在额外提供了4个输入,而不是1个
要避免这种情况,您可以遵循以下任一选项
col
值直接分配给参数本身很好的解释,非常感谢。虽然现在我得到一个属性错误。我将在问题中更新它。@NarendTransnair,错误'AttributeError:'int'对象没有属性'find',是因为代码
语句。在generate
函数中查找(col)
。这意味着您的语句
应该是string
对象,因为.find
是string对象的属性。使用循环中的所有列时,非对象数据类型列(int/float)将抛出此错误,因为它在这些数据类型上找不到属性。find
。为了避免这种情况,您可以在列表L中只包含object dtype列,或者在循环中再添加一行,将序列转换为字符串df[col]=df[col].astype('str')
Yes,实际上df[col]是int类型,我应该使用df['url']。我现在已经改正了。非常感谢您抽出时间来构思答案。非常感谢您的知识。我将在继续相应的操作后更新该问题。此错误意味着该语句是int,因此它没有方法。find()。数据帧中的不同列具有不同类型的对象,因此您可以检查该类型(语句)==str,或者使用str(语句)将语句转换为字符串(对于某些其他类型,这可能会失败,因此第一种方法更好)。是的,因为我使用的不是url列,而是df[col]这些都是零,它肯定是作为整数传递的,我必须将df['url']传递给函数。我会作出相应的修改。谢谢你。
def generate(statement,col):
if statement.find(col) == -1:
return 0
else:
return 1
for col in L:
print(df[col].apply(generate, args=(col)))
TypeError: generate() takes 2 positional arguments but 5 were given
df[col].apply(generate, col=col)
df[col].apply(generate, args=(col,))