2016-01-18 12 views
12

私は3番目のオプションが空白を取り除く最速の方法であると考えていたと思いますか?大規模なデータセットを扱うときに私が適用すべきいくつかの一般的なルールを誰かに教えてもらえますか?私は通常.astype(str)を使用していますが、すでにオブジェクトであることがわかっている列に対しては意味がないことは明らかです。 .map(str.strip).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つは等価ではありません。2.)NaNを壊さずに処理します。おそらく、それらのオーバーヘッドがどのように見えるかを見てください。 – TomAugspurger

+1

@TomAugspurger私は単純な30k行のテストを行った:df = pd.DataFrame({'id':['asds'、 'asd asdasdas']}) df = pd.concat([ df] * 10000、ignore_index = True) 'で、OP – EdChum

答えて

12

レッツ最初のルック。
したがって、実際にはmap(str.strip)がありますが、不足している値を処理するカスタムmap関数を使用して、str.strip()が何をするのかを理解する必要があります。
したがって、.str.strip()より多くなると、.map(str.strip)よりも、この方法は常に遅くなることが予想されます(あなたのケースでは2倍遅くなります)。

メソッドを使用すると、NaNの自動処理(または他の文字列以外の値の処理)に利点があります。 「ID」列がNaN値が含まれているとします@EdChumが指摘するように、あなたがこのパフォーマンスの違いが重要である場合は、任意の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 

、あなたは確かにmap(str.strip)を使用することができます。


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などの非文字列値を返します。

関連する問題