Как я могу добавить запятую в существующее значение в DataFrame?

#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», потому что это как-то проявилось), и я использовал ваш первый ответ, и он работал хорошо и гладко. Спасибо за помощь 🙂