#!/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[ ]: