strandtr for Pandas的性能

Lev*_*las 12 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
Run Code Online (Sandbox Code Playgroud)

jor*_*ris 13

我们先来看看.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
Run Code Online (Sandbox Code Playgroud)

正如@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
Run Code Online (Sandbox Code Playgroud)

需要注意的是在万一你有非字符串值(南安数值,...),使用.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
Run Code Online (Sandbox Code Playgroud)

如您所见,.str.strip()将非字符串值作为NaN返回,而不是将它们转换为字符串.