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)})
これまでだと↓のような感じで書く必要があったのが、(もしかするともっと良い書き方があるかも…?)
(
df
.groupby(['Store', 'Product'])
.sum()
.assign(rpq = lambda d: d.Revenue / d.Quantity)
.rpq
.unstack()
.round(2)
)
↓だけでよくなった
(
df
.groupby(['Store', 'Product'])
.pipe(lambda grp: grp.Revenue.sum() / grp.Quantity.sum())
.unstack()
.round(2)
)
count
ではなく size
を使う¶見逃しててずっと count
で頑張っていたが、
df.groupby(['Store', 'Product']).Product.count()
↓ こう書けば良い
df.groupby(['Store', 'Product']).size()
assign
内部で前に(定義|更新)したカラムを参照できるようになった(v0.23より)¶(
df
.assign(
rpq = lambda d: d.Revenue / d.Quantity,
rpq_squared = lambda d: d.rpq ** 2
)
.head()
)
assign と同じことを inplace でやりたいなら eval
で似たようなことができる
c.f. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.eval.html
df2 = df
df2.eval('rpq = Revenue / Quantity', inplace = True)
df2.eval('rpq_squared = rpq * rpq', inplace = True)
df2.head()