Фильтровать значения, начинающиеся с $
на Series.str.startswith
, удалить $
на Series.str.strip
, преобразовать в числа c, округлить, преобразовать в строки и добавить в начало $
:
m = df['Column_1'].str.startswith('$', na=False)
s = '$' + df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str)
Или:
s = df.loc[m, 'Column_1'].str.strip('$').astype(float).round(2).astype(str).radd('$')
df.loc[m, 'Column_1'] = s
print (df)
S.No. Column_1
0 1 256
1 2 1
2 3 $300.55
3 4 756
4 5 $292.34
Последнее, если необходимо, несопоставленные значения конвертируются в numeri c, но получают смешанные типы данных - строки с $
и числами без $
:
df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'])
print (df)
S.No. Column_1
0 1 256
1 2 1
2 3 $300.54672
3 4 756
4 5 $292.34333
print (df['Column_1'].apply(type))
0 <class 'int'>
1 <class 'int'>
2 <class 'str'>
3 <class 'int'>
4 <class 'str'>
Name: Column_1, dtype: object
РЕДАКТИРОВАТЬ для последнего абзаца: Здесь можно добавить errors='coerce'
для преобразования нечисловых c к отсутствующим значениям, а затем заменить их исходными:
df.loc[~m, 'Column_1'] = pd.to_numeric(df.loc[~m, 'Column_1'], errors='coerce').fillna(df['Column_1'])
print (df)
S.No. Column_1
0 1 256
1 2 1
2 3 $300.55
3 4 756
4 5 $292.34
5 6 Andrew
print (df['Column_1'].apply(type))
0 <class 'float'>
1 <class 'float'>
2 <class 'str'>
3 <class 'float'>
4 <class 'str'>
5 <class 'str'>
Name: Column_1, dtype: object