Использование str.replace (либо другого способа) для замены отдельных значений в DataFrame Pandas

Каким образом заменить в обрабатываемом массиве данных пробельный символ?

Имею большой массив данных (больше 500 тыс строк) в .txt. Читаю массив:

df = pd.read_csv(file, encoding=ENCODING, sep='\t',decimal=',')

Ловлю предупреждение:

DtypeWarning: Columns (7,13) have mixed types. Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

Итоговый DataFrame состоит из:

calculation                 object
period              datetime64[ns]
status                      object
baket                       object
remainder                    int64
nil                        float64
pdz                        float64
ead                         object
recovery                   float64
lgd                        float64
pd_month                   float64
rezervation_rate           float64
pd_lgd_ead                 float64
reserve                     object

Нахожу вхождения в столбце ead, в которых содержится пробельный символ:

non_numeric = df.ead.str.contains('\s', na=False)
df.loc[non_numeric].ead.size # 1

Проблема в том, чтобы заменить эти вхождения на нечто, позволяющее в итоге конвертировать в числовой тип.

Метод df.ead.str.replace('\s', '') возвращает копию df.ead, удаляя пробельный символ, но при этом все остальные значения устанавливаются в NaN (что, в общем-то понятно).
Метод df.loc[non_numeric].ead.str.replace('\s', '') возвращает одну строку с нужным значением. Не могу придумать как одну строку исходного массива заменить на полученный результат.

Прямой способ не срабатывает:

df.loc[non_numeric].ead = df.copy().loc[non_numeric].ead.str.replace('\s', '')
non_numeric = df.ead.str.contains('\s', na=False)
df.loc[non_numeric].ead.size # 1

В итоге вопрос: как заменить одно значение ячейки массива данных на другое?


Ответы (2 шт):

Автор решения: Алекс Серкин

В итоге решением является:

df.ead.replace(regex=True,inplace=True,to_replace=r'\D',value=r'')
df.ead = df.ead.apply(pd.to_numeric)

Для полноты картины, второй столбец так же обрабатываю:

df.reserve.replace(regex=True,inplace=True,to_replace=r'\D',value=r'')
df.reserve = df.reserve.apply(pd.to_numeric)

В итоге добился желаемого:

calculation                 object
period              datetime64[ns]
status                      object
baket                       object
remainder                    int64
nil                        float64
pdz                        float64
ead                        float64
recovery                   float64
lgd                        float64
pd_month                   float64
rezervation_rate           float64
pd_lgd_ead                 float64
reserve                    float64
→ Ссылка
Автор решения: MaxU

можно попробовать так:

cols = ['ead', 'reserve']
df[cols] = df[cols].replace(r'\D', '', regex=True).apply(pd.to_numeric, errors='coerce')
→ Ссылка