大熊猫str.strip的性能

时间:2016-01-18 19:15:33

标签: python-3.x pandas

我认为第三个选项应该是剥离空白的最快方法?在处理大型数据集时,有人可以给我一些我应该应用的一般规则吗?我通常使用.astype(str)但很明显,对于我知道已经是对象的列来说这是不值得的。

%%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 个答案:

答案 0 :(得分:12)

让我们先来看看.map(str.strip).str.strip()之间的区别(第二和第三种情况)。
因此,您需要了解str.strip()幕后的内容:它实际上会执行一些map(str.strip),但使用自定义map函数来处理缺失的值。
因此,假设.str.strip() .map(str.strip)更多,则可以预期此方法将始终较慢(并且正如您所示,在您的情况下,速度慢2倍)。

使用.str.strip()方法在自动NaN处理(或处理其他非字符串值)方面具有优势。假设' id'列包含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指出的那样,如果确定你没有任何NaN值,那么你确实可以使用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返回,而不是将它们转换为字符串。