假设我有一个类似这样的系列:
manager.list
我想执行一个简单的正则表达式替换。
我应该支持<input class="form-control ml-1" type="text" placeholder="Найти запчасть по названию" #search>
还是<tr *ngFor="let item of currentModel | searchPipe: search.value">
?
我从未发现任何性能差异,并且查看文档,Series.replace
似乎比Series.str.replace
更为通用。那么后者的存在理由是什么呢?
答案 0 :(得分:4)
在我看来你是对的。
str.replace
仅适用于string
列中的值,否则为错误。
replace
也适用于string
和no string
的值,因此更为通用。
此外,如果参数regex=True
替换了子字符串,如果没有,则替换Series
的值。
这个answer更好地解释了。
答案 1 :(得分:1)
我将提供一个更通用的答案来解决 replace 和 str.replace 之间的差异。在我看来,确实替换在大多数情况下更有用。我使用以下简单的数据框说明了五个不同之处。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'object':[123,'123','123abc','abc','a',2],
'integer':[123,456,789,1,2,3]})
print(df1.dtypes)
首先,'str.replace' 只是一个 Series 方法,而 'replace' 既是一个 Series 又是一个 DataFrame 方法。因此,虽然 'str.replace' 一次只能应用于一个变量或列,但 'replace' 可以一次性应用于整个数据帧。
df2 = df1.str.replace(2, '') # throws error
df2 = df1.replace(2, '') # works without issues
print(df1,'\n\n',df2)
第二,'str.replace' 不适用于整数和浮点数,但 'replace' 可以。考虑到该方法的“字符串”性质,这应该是显而易见的,但我仍然表明它是全面的。
df1['integer1'] = df1['integer'].str.replace(2,'') # throws error
df1['integer2'] = df1['integer'].replace(2,'') # replaces with blank, but leads to variable converting to object type
df1['integer3'] = df1['integer'].replace(2,np.nan) # replaces with blank, but leads to variable converting to float type
print(df1)
print(df1.dtypes)
第三,'str.replace' 不能用 np.nan 替换值,但 'replace' 可以。
df1['object1'] = df1['object'].str.replace('a',np.nan) # throws error
df1['object2'] = df1['object'].replace('a',np.nan) # replaces with np.nan; object type remains as is
print(df1.drop('integer', axis=1))
print(df1.dtypes)
第四,'str.replace' 将默认替换子字符串,而 'replace' 将替换整个单词。这是因为“str.replace”默认为“regex=True”,而“replace”默认为 regex=False。此外,'str.replace' 在处理过程中用 np.nan 替换整数和浮点数。 “替换”不会这样做。
df1['object1'] = df1['object'].str.replace('a','')
df1['object2'] = df1['object'].replace('a','')
print(df1.drop('integer', axis=1))
第五,要使用'replace'替换子字符串,我们必须使用regex=True。正如我们在前面的例子中看到的,'str.replace' 不需要 regex=True,因为它已经默认打开了。
df1['object1'] = df1['object'].str.replace('a','', regex=True) # same result as without regex=True
df1['object2'] = df1['object'].replace('a','', regex=True) # not the same result as without regex=True
print(df1.drop('integer', axis=1))