Starting with Pandas version 0.22を加重平均を行うには、apply
の代替も存在する方法である:(あなたもthis questionを確認することができますpipe
、apply
を使用するよりもかなり高速になります2つの機能の間の相違点については、ご例えば
:
df = pd.DataFrame({"my_label": ['A','B','A','C','D','D','E']})
my_label
0 A
1 B
2 A
3 C
4 D
5 D
6 E
apply
バージョン
df.groupby('my_label').apply(lambda grp: grp.count()/df.shape[0])
は
my_label
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
とpipe
バージョン
を与える
df.groupby('my_label').pipe(lambda grp: grp.size()/grp.size().sum())
の
利回り
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
だから値がしかし、タイミングが(少なくとも、この小さなデータフレームのために)非常に多くの異なる、同じです:
%timeit df.groupby('my_label').apply(lambda grp: grp.count()/df.shape[0])
100 loops, best of 3: 5.52 ms per loop
と
%timeit df.groupby('my_label').pipe(lambda grp: grp.size()/grp.size().sum())
1000 loops, best of 3: 843 µs per loop
それを関数にラップすることもまた簡単です:
def get_perc(grp_obj):
gr_size = grp_obj.size()
return gr_size/gr_size.sum()
今、あなたはしかし、この特定のケースのために、あなたもgroupby
を必要としない、しかし、あなたはちょうどこのようvalue_counts
を使用することができます
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
を得
df.groupby('my_label').pipe(get_perc)
を呼び出すことができます。
df['my_label'].value_counts(sort=False)/df.shape[0]
この小さなデータフレームのために
A 0.285714
C 0.142857
B 0.142857
E 0.142857
D 0.285714
Name: my_label, dtype: float64
それはあなたにも簡単にするために `ヒスト= gg.sizeを()`を使用することができ、非常に高速
%timeit df['my_label'].value_counts(sort=False)/df.shape[0]
1000 loops, best of 3: 770 µs per loop
です – Reservedegotist