2017-03-08 18 views
2

次のパンダコードでは、なぜdfは引数に不要なのですか?パンダ、適用関数、ラムダ

+1

'にあなたが使用される'軸= 0 'かどうかに応じて 'Series'ように、列または行のいずれかを通過し得る.apply'渡された関数'軸= 1とする。 –

答えて

1

最初のパラメータは、apply呼び出しの関数に暗黙的に渡されます。したがって、argsに再び現れません。あなたは実際には、無関係の関数を適用して

df.groupby('Category').apply(lambda x: sum(x["Weight (oz.)"] * x["Quantity"])) 

ここではまったく使用することなく、書き直すことができます。 xが明示的に渡されずに渡される最初のパラメータであることは明らかです。

0

さらに一般的には、applyは、DataFrameインスタンスdfのメソッドです。

これは、applyに暗黙的にselfパラメータが渡されるという意味になります。呼び出しがapply(self, *args)であると想像してください。

ここでselfは、DataFrameインスタンスdfを指します。今度は、dfをもう一度渡すことは(許可されていれば)冗長になるはずです。

0

あなたが、例えば、ここですべてのapplyを必要としない、とだけ あなた'Category'列によって興味のある2列の製品をグループ化することによって、かなりの操作をスピードアップすることができ、多少関連して言及する価値があります

(df['Weight (oz.)'] * df['Quantity']).groupby(df.Category).sum() 

df = pd.DataFrame(dict(category=[1, 1, 1, 2, 2, 2, 3, 3, 3]*(10**6), 
         a = np.random.randint(1, 10, 9*(10**6)), 
         b=np.random.randint(1, 10, 9*(10**6)))) 

%timeit (df.a*df.b).groupby(df.category).sum() 
1 loop, best of 3: 560 ms per loop 

%timeit df.groupby('category').apply(lambda x: sum(x.a*x.b)) 
1 loop, best of 3: 3.34 s per loop
関連する問題