Python应用,将字典作为参数传递

Python应用,将字典作为参数传递,python,pandas,Python,Pandas,我想将字典作为附加参数传递给函数。该函数将应用于数据帧的每一行。所以我用“apply”。下面是我尝试的一个小例子: import pandas as pd import numpy as np def fun(df_row, dict1): return df_row['A']*2*max(dict1['x']) df = pd.DataFrame(np.random.randn(6,2),columns=list('AB')) dict_test = {'x': [1,2,3,4], '

我想将字典作为附加参数传递给函数。该函数将应用于数据帧的每一行。所以我用“apply”。下面是我尝试的一个小例子:

import pandas as pd
import numpy as np

def fun(df_row, dict1):
 return df_row['A']*2*max(dict1['x'])

df = pd.DataFrame(np.random.randn(6,2),columns=list('AB'))
dict_test = {'x': [1,2,3,4], 'y': [5,6,7,8]}
df['D'] = df.apply(fun, args = (dict_test), axis = 1)
我收到以下错误消息: ('fun()正好接受1个参数(给定3个)'u'发生在索引0'处) 我使用**dict1表示函数“fun”中的键值对

奇怪的是,如果我通过了两次辩论,事情就会进展顺利

def fun(df_row, dict1, dict2):
 return df_row['A']*2*max(dict1['x'])

df = pd.DataFrame(np.random.randn(6,2),columns=list('AB'))
dict_test = {'x': [1,2,3,4], 'y': [5,6,7,8]}
df['D'] = df.apply(fun, axis = 1,  args = (dict_test, dict_test))

pd.DataFrame.apply
doc:

最后一行的意思是,如果您想要解包
dict_test
,将参数作为关键字传递给
fun
,您可以执行以下操作:

df['D'] = df.apply(fun, axis=1, **dict_test)
以前您使用过:

df['D'] = df.apply(fun, args = (dict_test), axis = 1)
这意味着
apply
将尝试通过以下方式调用
fun

fun(df_row, dict_test)

但这不是您定义的
fun
(一旦您对位置参数和关键字参数有了更多了解,您就会发现不同之处)

来自
pd.DataFrame.apply
doc:

最后一行的意思是,如果您想要解包
dict_test
,将参数作为关键字传递给
fun
,您可以执行以下操作:

df['D'] = df.apply(fun, axis=1, **dict_test)
以前您使用过:

df['D'] = df.apply(fun, args = (dict_test), axis = 1)
这意味着
apply
将尝试通过以下方式调用
fun

fun(df_row, dict_test)

但这不是您定义的
fun
(一旦您对位置参数和关键字参数有了更多了解,您就会发现不同之处)

问题是您没有传递元组,
(dict\u test)
不是元组,它与
dict\u test
相同。您需要一个元组,其中只有
dict\u test
元素,即
(dict\u test,)


问题是您没有传递元组,
(dict\u test)
不是元组,它与
dict\u test
相同。您需要一个元组,其中只有
dict\u test
元素,即
(dict\u test,)



您不应该使用
**
。字典将作为普通参数传递,而不是作为关键字参数。如果我删除**,那么如果定义
fun()
以获取
*args
并打印
args
,则会得到错误('fun()正好获取2个参数(3个给定参数)',u'发生在索引0'),这将使您了解传递给字典的数据。您肯定需要向函数中添加另一个参数,但这应该会告诉您它是什么。它似乎只传递字典的键,而不是键值对。这是一行:
(A-0.207240 B 1.193103名称:0,数据类型:float64,'y','x')
Hi。不清楚您想要实现什么:如果
dict_test
项作为关键字参数传递,您将得到
dict1['x']
这是一个包含4个整数的列表,您将尝试与
df['a']*2
相乘。。。那是行不通的。我知道这是一个玩具示例,但如果你能澄清这一点,那么问题就更容易回答了。你不应该使用
**
。字典将作为普通参数传递,而不是作为关键字参数。如果我删除**,那么如果定义
fun()
以获取
*args
并打印
args
,则会得到错误('fun()正好获取2个参数(3个给定参数)',u'发生在索引0'),这将使您了解传递给字典的数据。您肯定需要向函数中添加另一个参数,但这应该会告诉您它是什么。它似乎只传递字典的键,而不是键值对。这是一行:
(A-0.207240 B 1.193103名称:0,数据类型:float64,'y','x')
Hi。不清楚您想要实现什么:如果
dict_test
项作为关键字参数传递,您将得到
dict1['x']
这是一个包含4个整数的列表,您将尝试与
df['a']*2
相乘。。。那是行不通的。我知道这是一个很有趣的例子,但如果你能澄清这一点,这会使问题更容易回答。仍然不起作用:
,这有点奇怪。在所有其他要应用的参数之后,您是否通过了
**dict_test
?是的,与您键入的itHmmm完全相同。我对它进行了测试,它在我这边起作用。按照定义fun的方式,您应该能够调用
fun({“A”:1},x=[1],y=2)
,而不会出现错误。你能检查一下吗?你最近编辑了一篇文章,这篇评论建议你应该花些时间阅读关于参数、关键字参数和字典解包的内容;)。基本上,您定义
fun
dict1的方式不应作为常规参数。相反,它包含关键字参数。您可以在apply中使用
args
传递字典,但是您需要函数期望字典。您可以使用:
def-fun(df_行,dict1):…
。仍然不起作用:
(“fun()得到一个意外的关键字参数'y',u'出现在索引0')
,这有点奇怪。在所有其他要应用的参数之后,您是否通过了
**dict_test
?是的,与您键入的itHmmm完全相同。我对它进行了测试,它在我这边起作用。按照定义fun的方式,您应该能够调用
fun({“A”:1},x=[1],y=2)
,而不会出现错误。你能检查一下吗?你最近编辑了一篇文章,这篇评论建议你应该花些时间阅读关于参数、关键字参数和字典解包的内容;)。基本上,您定义
fun
dict1的方式不应作为常规参数。相反,它包含关键字参数。您可以在apply中使用
args
传递字典,但是您需要函数期望字典。你可以用:
deffun(df_行,dict1):…
。args=(dict_test,)
中的逗号是什么意思?@conchoecia。args=(dict_test,)中的逗号是什么意思?@conchoecia是用来做什么的。