#!/usr/bin/env python # coding: utf-8 #

Table of Contents

#
# In[1]: import pandas as pd import numpy as np n = 1000 df = pd.DataFrame({'Store': np.random.choice(['Store_1', 'Store_2'], n), 'Product': np.random.choice(['Product_1', 'Product_2', 'Product_3'], n), 'Revenue': (np.random.random(n)*50+10).round(2), 'Quantity': np.random.randint(1, 10, size=n)}) # # GroupBy オブジェクトに pipe メソッドが追加された(v0.23より) # # c.f. https://pandas.pydata.org/pandas-docs/version/0.23.0/whatsnew.html#groupby-objects-now-have-a-pipe-method # # これまでだと↓のような感じで書く必要があったのが、(もしかするともっと良い書き方があるかも…?) # In[2]: ( df .groupby(['Store', 'Product']) .sum() .assign(rpq = lambda d: d.Revenue / d.Quantity) .rpq .unstack() .round(2) ) # ↓だけでよくなった # In[3]: ( df .groupby(['Store', 'Product']) .pipe(lambda grp: grp.Revenue.sum() / grp.Quantity.sum()) .unstack() .round(2) ) # # 各グループの要素数をカウントするときは、`count` ではなく `size` を使う # # 見逃しててずっと `count` で頑張っていたが、 # In[4]: df.groupby(['Store', 'Product']).Product.count() # ↓ こう書けば良い # In[5]: df.groupby(['Store', 'Product']).size() # # ひとつの `assign` 内部で前に(定義|更新)したカラムを参照できるようになった(v0.23より) # # c.f. https://pandas.pydata.org/pandas-docs/version/0.23.0/whatsnew.html#assign-accepts-dependent-arguments # In[6]: ( df .assign( rpq = lambda d: d.Revenue / d.Quantity, rpq_squared = lambda d: d.rpq ** 2 ) .head() ) # # DataFrame.eval # # assign と同じことを inplace でやりたいなら `eval` で似たようなことができる # # c.f. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.eval.html # In[7]: df2 = df df2.eval('rpq = Revenue / Quantity', inplace = True) df2.eval('rpq_squared = rpq * rpq', inplace = True) df2.head() # In[ ]: