Не удалось заменить строку, содержащую $ в столбце панд - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть dataframe

df = pd.DataFrame({'a':[1,2,3], 'b':[5, '12$sell', '1$sell']})

Я хочу заменить $ sell из столбца b.

Так что я попробовал replace() метод, как показано ниже

df['b'] = df['b'].str.replace("$sell","")

, но он не заменяет данную строку и дает мне тот же кадр данных, что и оригинал.

Он работает, когда я использую его с apply

df['b'] = df['b'].apply(lambda x: str(x).replace("$sell",""))

Итак, я хочу знать, почему это не работает в предыдущем случае?

Примечание: я попытался заменить только $ и шокирующе это работает.

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

str.replace предполагает, что используется регулярное выражение.так что вам нужно использовать escape то есть

df['b'] = df['b'].str.replace("\$sell","")
0 голосов
/ 28 сентября 2018

Это метасимвол 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
0 голосов
/ 28 сентября 2018

$ - это специальный символ регулярного выражения.По умолчанию pd.Series.str.replace использует regex=True.

Вместо этого укажите regex=False:

df['b'] = df['b'].str.replace('$sell', '', regex=False)
0 голосов
/ 28 сентября 2018
df['b'] = df['b'].str.replace("$sell","", regex=False)
...