Python 3.x 大熊猫str.strip的性能
我以为第三种方法应该是去除空白的最快方法?有人能给我一些在处理大型数据集时应该应用的一般规则吗?我通常使用.astype(str),但对于我知道已经是对象的列来说,这显然是不值得的Python 3.x 大熊猫str.strip的性能,python-3.x,pandas,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 o
%%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
让我们首先看看
.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形式返回非字符串值,而不是将其转换为字符串。可能值得一问,为什么会出现这种情况,因为这不是我所期望的情况。最好先做一点分析,看看是什么导致了相对的减速。一般来说,您的最后两个方法并不相等,因为pandas.str
方法都是1.)使用正则表达式或字符串,2.)在不爆炸的情况下处理NaN。也许可以看看这些开销是什么样子。@Tomaugsburger我在一个简单的30k行df:df=pd.DataFrame({'id':['asds','asasasd','asdsa asdasdas']})df=pd.concat([df]*10000,忽略_index=True)
并观察到与OP@TomAugspurger计时:In[8]:%timeit df['id'].astype(str.map)(str.strip)%timeit-df['id'].map(str.strip)%timeit-df['id'].str.strip()10个循环,每个循环最好3:21毫秒100个循环,每个循环最好3:11.4毫秒10个循环,每个循环最好3:25.4毫秒
我想这里的经验法则是,如果你知道你的数据简单且非空,那么调用。map(str.strip)
会更快,否则,对于NaN
处理和正则表达式模式,则使用pd.Series.str.strip