熊猫应用函数-args如何传递

时间:2020-06-28 05:36:42

标签: python-3.x pandas dataframe apply

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/Cars93_miss.csv')
d = {'Min.Price': np.nanmean, 'Max.Price': np.nanmedian}
df[['Min.Price', 'Max.Price']] = df[['Min.Price', 'Max.Price']].apply(lambda x, d: x.fillna(d[x.name](x)), args=(d, ))

apply(lambda x, d: x.fillna(d[x.name](x)), args=(d, ))-无法理解此部分。我知道apply和fillna的工作原理,但是使用此args令人困惑。

  1. 为什么args末尾有逗号
  2. d实际传递了什么-

2 个答案:

答案 0 :(得分:1)

要更直接地回答您的问题:

  1. args是一个元组,单个元素元组需要一个逗号结尾,以便正确地将其标识为元组,而不仅仅是参数化对象。
  2. d是您的字典,在最后传递时,我相信这是将lambda函数应用于字典中的每个元素之后的当前列表,该元素表示元素是NaN还是N / A (即Null / missing),那么它将使用指定的给定值填充它们。 pandas.DataFrame.fillna 希望有帮助。

答案 1 :(得分:1)

您知道,df.apply函数将一个函数应用于DataFrame的元素。现在,此函数通常仅接受一个参数。当您需要对df.apply使用多参数函数时,可以使用args参数指定其他参数

从文档字符串(print(pd.DataFrame.apply.__doc__)

args : tuple
    Positional arguments to pass to `func` in addition to the
    array/series.

在这里,您将两个参数函数与lambda x, d:一起使用,因此您需要使用args=指定第二个参数。在这里,它期待带有参数的元组

要将单个元素放入元组,需要将其放在方括号中并以逗号结尾。

print(1)                                                                              
>>>1
print((1,))                                                                           
>>>(1,)

要将变量d放入元组,您需要执行(d,)

该词典包含两列的两个单独函数,以列名称为其键。因此,x是传递给lambda函数的列,x.name为您提供了列名,而d[x.name]为您提供了用于该列名的函数。然后将该函数应用于列。

对于“最低价格”列,功能为np.nanmean。因此d[x.name](x)的计算结果为np.nanmean(x),这将为您提供排除nan的列均值。现在,您使用平均值通过执行nan

来填充原始列中的x.fillna(d[x.name](x))