Это метасимвол regex (конец строки), экранируйте его или добавьте параметр regex=False
:
df['b'] = df['b'].str.replace("\$sell","")
print (df)
a b
0 1 NaN
1 2 12
2 3 1
df['b'] = df['b'].str.replace("$sell","", regex=False)
Если хотите также значение 5, что является числовым, используйте Series.replace
с регулярным выражением = True для замены подстрок - числовые значения не затрагиваются:
df['b'] = df['b'].replace("\$sell","", regex=True)
print (df['b'].apply(type))
0 <class 'int'>
1 <class 'str'>
2 <class 'str'>
Name: b, dtype: object
Или приведение к строкам всех данных столбца:
df['b'] = df['b'].astype(str).str.replace("$sell","", regex=False)
print (df['b'].apply(type))
0 <class 'str'>
1 <class 'str'>
2 <class 'str'>
Name: b, dtype: object
И длялучшая производительность, если нет пропущенных значений, используйте понимание списка:
df['b'] = [str(x).replace("$sell","") for x in df['b']]
print (df)
a b
0 1 5
1 2 12
2 3 1