2016-01-18 11 views
12

के लिए str.strip का प्रदर्शन मैंने सोचा कि तीसरा विकल्प सफेद जगहों को पट्टी करने का सबसे तेज़ तरीका माना जाता है? क्या कोई मुझे कुछ सामान्य नियम दे सकता है कि मुझे बड़े डेटा सेट के साथ काम करते समय आवेदन करना चाहिए? मैं आमतौर पर .astype (str) का उपयोग करता हूं लेकिन स्पष्ट रूप से कॉलम के लिए उपयुक्त नहीं है जो मुझे पता है कि पहले से ही ऑब्जेक्ट्स हैं। .map(str.strip) और .str.strip() (दूसरे और तीसरे मामले) के बीच अंतर परपांडस

%%timeit 
fcr['id'] = fcr['id'].astype(str).map(str.strip) 
10 loops, best of 3: 47.8 ms per loop 

%%timeit 
fcr['id'] = fcr['id'].map(str.strip) 
10 loops, best of 3: 25.2 ms per loop 

%%timeit 
fcr['id'] = fcr['id'].str.strip(' ') 
10 loops, best of 3: 55.5 ms per loop 
+1

शायद यह [github] (https://github.com/pydata/pandas/issues) पर पूछने लायक है क्यों यह मामला है क्योंकि यह अपेक्षा नहीं है कि मैं – EdChum

+1

थोड़ा सा करना चाहूंगा रिश्तेदार मंदी के कारण क्या देखने के लिए पहले अधिक प्रोफाइलिंग। आम तौर पर आपके पिछले दो पांडा '.str' विधियों के बराबर नहीं होंगे 1.) रेगेक्स या तार लेते हैं, 2.) बिना उड़ने के NaNs को संभाल लें। शायद देखें कि उन लोगों का ऊपरी भाग कैसा दिखता है। – TomAugspurger

+1

@TomAugspurger मैंने एक साधारण 30k पंक्ति डीएफ पर परीक्षण किया: 'df = pd.DataFrame ({'id': ['asds', 'asd के रूप में', 'asdsa asdasdas']} df = pd.concat ([ डीएफ] * 10000, ignore_index = True) 'और ओपी – EdChum

उत्तर

12

आइए पहले देखो।
इसलिए, आपको समझने की आवश्यकता है कि str.strip() हुड के नीचे क्या होता है: यह वास्तव में कुछ map(str.strip) करता है, लेकिन एक कस्टम map फ़ंक्शन का उपयोग करके अनुपलब्ध मानों को संभालेगा।
इसलिए .str.strip().map(str.strip) से अधिक करता है, यह उम्मीद की जाती है कि यह विधि हमेशा धीमी हो जाएगी (और जैसा कि आपने दिखाया है, आपके मामले में 2x धीमी है)।

.str.strip() विधि का उपयोग करने से स्वचालित NaN हैंडलिंग (या अन्य गैर-स्ट्रिंग मानों को संभालने) में इसका लाभ होता है। मान लीजिए 'आईडी' स्तंभ एक NaN मूल्य में शामिल है:

In [4]: df['id'].map(str.strip) 
... 
TypeError: descriptor 'strip' requires a 'str' object but received a 'float' 

In [5]: df['id'].str.strip() 
Out[5]: 
0     NaN 
1    as asd 
2  asdsa asdasdas 
       ... 
29997    asds 
29998   as asd 
29999 asdsa asdasdas 
Name: id, dtype: object 

@EdChum बताते हैं के रूप में, आप वास्तव में उपयोग कर सकते हैं map(str.strip)अगर आप यकीन है कि अगर इस प्रदर्शन अंतर महत्वपूर्ण है कि आप किसी भी NaN मान नहीं हैं कर रहे हैं।


fcr['id'].astype(str).map(str.strip) के अन्य अंतर पर वापस आ रहा है। यदि आप पहले से ही जानते हैं कि श्रृंखला के अंदर के मूल्य स्ट्रिंग हैं, तो astype(str) कॉल करना निश्चित रूप से अनिवार्य है।

In [74]: %timeit df['id'].astype(str).map(str.strip) 
100 loops, best of 3: 10.5 ms per loop 

In [75]: %timeit df['id'].astype(str) 
100 loops, best of 3: 5.25 ms per loop 

In [76]: %timeit df['id'].map(str.strip) 
100 loops, best of 3: 5.18 ms per loop 

नोट मामले में आप गैर स्ट्रिंग मूल्यों (NaN, संख्यात्मक मूल्य, ...) है, का उपयोग कर .str.strip() और .astype(str).map(str)नहीं ही निकलेगा: और यह इस कॉल कि अंतर बताते है परिणाम:

In [11]: s = pd.Series([' a', 10]) 

In [12]: s.astype(str).map(str.strip) 
Out[12]: 
0  a 
1 10 
dtype: object 

In [13]: s.str.strip() 
Out[13]: 
0  a 
1 NaN 
dtype: object 

आप देख सकते हैं, .str.strip() गैर स्ट्रिंग मान NaN के रूप में, वापस आ जाएगी बजाय उन्हें तार को बदलने की।