我认为第三个选项应该是剥离空白的最快方法?在处理大型数据集时,有人可以给我一些我应该应用的一般规则吗?我通常使用.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
答案 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返回,而不是将它们转换为字符串。