Использование 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
можно попробовать так:
cols = ['ead', 'reserve']
df[cols] = df[cols].replace(r'\D', '', regex=True).apply(pd.to_numeric, errors='coerce')