#python-3.x #pandas #dataframe #replace #comma
#python #python-3.x #панды #dataframe #форматирование чисел
Вопрос:
Я очистил фрейм данных с одного веб-сайта, но во время очистки я потерял запятую в значениях, поэтому это выглядит так, как показано ниже:
name price
x 100
y 89
z 123584
Теперь мне нужно изменить значения в столбце «цена», добавив запятую в каждое значение на втором месте, считая по праву. Результат должен быть таким:
name price
x 1,00
y 0,89
z 1235,84
У вас есть какие-либо идеи, как я могу этого добиться?
Ответ №1:
Мы можем попробовать использовать str.replace
здесь:
df['price'] = df['price'].astype('str').str.replace(r'^(d{2})
Первый вызов str.replace
добавляет начальный ноль для тех цен, которые состоят только из двух (десятичных) чисел. Второй вызов вставляет разделитель запятой перед последними двумя десятичными цифрами.
Комментарии:
1. Спасибо за ответ и помощь, но я получаю в столбце "цена" только значения NaN. Возможно, мне следует добавить, что значения в столбцах price являются "object" (я проверил с помощью df.dtypes)
2. @Tmiskiewicz Попробуйте использовать
astype('str')
вместе с моей той же логикой для первого преобразованияprice
в строку.3. Ваш ответ также работает 🙂 и эта подсказка с преобразованием в строку была ключевой, так что спасибо за помощь
Ответ №2:
Мы можем нарезать вашу строку и добавить запятые:
df['price'].str[:-2] ',' df['price'].str[-2:]
0 1,00
1 ,89
2 1235,84
Name: price, dtype: object
Или мы можем использовать str.cat
с sep
аргументом:
df['price'].str[:-2].str.cat(df['price'].str[-2:], sep=',')
0 1,00
1 ,89
2 1235,84
Name: price, dtype: object
Комментарии:
1. Спасибо за помощь! Я пытался использовать оба ваших ответа, и это очень странно, потому что это изменило только части значений в столбце, а остальные - NaN. Я не вижу шаблона, почему он изменил только часть значений...
2. Я получил это. Я изменил тип столбца на строку (после этого мне пришлось удалить из строки ".0", потому что это как-то проявилось), и я использовал ваш первый ответ, и он работал хорошо и гладко. Спасибо за помощь 🙂
, '0\1')
.str.replace(r'^(d )(d{2})Первый вызов str.replace
добавляет начальный ноль для тех цен, которые состоят только из двух (десятичных) чисел. Второй вызов вставляет разделитель запятой перед последними двумя десятичными цифрами.
Комментарии:
1. Спасибо за ответ и помощь, но я получаю в столбце "цена" только значения NaN. Возможно, мне следует добавить, что значения в столбцах price являются "object" (я проверил с помощью df.dtypes)
2. @Tmiskiewicz Попробуйте использовать
astype('str')
вместе с моей той же логикой для первого преобразованияprice
в строку.3. Ваш ответ также работает 🙂 и эта подсказка с преобразованием в строку была ключевой, так что спасибо за помощь
Ответ №2:
Мы можем нарезать вашу строку и добавить запятые:
Или мы можем использовать str.cat
с sep
аргументом:
Комментарии:
1. Спасибо за помощь! Я пытался использовать оба ваших ответа, и это очень странно, потому что это изменило только части значений в столбце, а остальные - NaN. Я не вижу шаблона, почему он изменил только часть значений...
2. Я получил это. Я изменил тип столбца на строку (после этого мне пришлось удалить из строки ".0", потому что это как-то проявилось), и я использовал ваш первый ответ, и он работал хорошо и гладко. Спасибо за помощь 🙂
, '\1,\2')
Первый вызов str.replace
добавляет начальный ноль для тех цен, которые состоят только из двух (десятичных) чисел. Второй вызов вставляет разделитель запятой перед последними двумя десятичными цифрами.
Комментарии:
1. Спасибо за ответ и помощь, но я получаю в столбце «цена» только значения NaN. Возможно, мне следует добавить, что значения в столбцах price являются «object» (я проверил с помощью df.dtypes)
2. @Tmiskiewicz Попробуйте использовать
astype('str')
вместе с моей той же логикой для первого преобразованияprice
в строку.3. Ваш ответ также работает 🙂 и эта подсказка с преобразованием в строку была ключевой, так что спасибо за помощь
Ответ №2:
Мы можем нарезать вашу строку и добавить запятые:
Или мы можем использовать str.cat
с sep
аргументом:
Комментарии:
1. Спасибо за помощь! Я пытался использовать оба ваших ответа, и это очень странно, потому что это изменило только части значений в столбце, а остальные — NaN. Я не вижу шаблона, почему он изменил только часть значений…
2. Я получил это. Я изменил тип столбца на строку (после этого мне пришлось удалить из строки «.0», потому что это как-то проявилось), и я использовал ваш первый ответ, и он работал хорошо и гладко. Спасибо за помощь 🙂