Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 大熊猫str.strip的性能_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 大熊猫str.strip的性能

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

我以为第三种方法应该是去除空白的最快方法?有人能给我一些在处理大型数据集时应该应用的一般规则吗?我通常使用.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

让我们首先看看
.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