Python Pandas Apply,将字典作为参数传递

时间:2016-03-25 22:20:15

标签: 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], 'y': [5,6,7,8]}
df['D'] = df.apply(fun, args = (dict_test), axis = 1)

我收到以下错误消息:     ('fun()只需1个参数(3个给定)',u'occurred at index 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))

2 个答案:

答案 0 :(得分:4)

问题是你没有传递元组,(dict_test)不是元组,它与dict_test相同。您希望使用dict_test作为唯一元素的元组,即(dict_test,)

df['D'] = df.apply(fun, args=(dict_test,), axis=1)

答案 1 :(得分:1)

来自pd.DataFrame.apply doc:

Parameters
----------
...
args : tuple
    Positional arguments to pass to function in addition to the
    array/series
Additional keyword arguments will be passed as keywords to the function

最后一行意味着如果您要解包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(一旦你对位置和关键字参数有了更多了解,你就会有所不同)。