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令人困惑。
答案 0 :(得分:1)
要更直接地回答您的问题:
args
是一个元组,单个元素元组需要一个逗号结尾,以便正确地将其标识为元组,而不仅仅是参数化对象。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))