Starting with Pandas version 0.22, वहाँ भी apply
के लिए एक विकल्प मौजूद है: pipe
है, जो काफी तेज apply
का उपयोग करने से हो सकता है (आप भी this question जाँच कर सकते हैं दो कार्यक्षमताओं के बीच अधिक अंतर के लिए)।
अपने उदाहरण के लिए
:
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
तो मान रहे हैं समान है, तथापि, समय काफी एक बहुत अलग (कम से कम इस छोटे से dataframe के लिए):
%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()
अब आप
df.groupby('my_label').pipe(get_perc)
my_label
A 0.285714
B 0.142857
C 0.142857
D 0.285714
E 0.142857
उपज हालांकि, इस विशेष मामले के लिए, आप भी एक groupby
की जरूरत नहीं है कॉल कर सकते हैं, लेकिन आप सिर्फ इस तरह value_counts
उपयोग कर सकते हैं:
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
इस छोटे से dataframe के लिए यह
%timeit df['my_label'].value_counts(sort=False)/df.shape[0]
1000 loops, best of 3: 770 µs per loop
तुम भी उपयोग कर सकते हैं 'histo = gg.size()' सादगी के लिए काफी तेजी से होता है – Reservedegotist