Python 类型错误:Dataframe应用函数,参数传递

Python 类型错误: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个 任何建议都

默认情况下,列都设置为零。 在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个

任何建议都会有帮助

编辑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,))