Я хочу отформатировать числа в столбце df в местную валюту.
Например, учитывая исходный df:
Если бы я был в Великобритании, результат таблицы должен был бы быть:
и если бы я использовал таблицу в США, вместо этого она была бы преобразована в следующую:
Я пытался:
locale.currency(x, grouping=True)
но я не могу применить его к столбцу df.
Есть ли способ оставить его плавающим для выполнения вычислений? А также правильно отформатируйте, если расчет дает отрицательный результат, он должен отображаться:
- CCY XXX.YY
вместо
CCY - XXXX.YY
Вы можете использовать locale.setlocale(locale.LC_ALL, 'en_GB.UTF-8')
с функцией форматирования, а затем apply()
функцию:
import locale
import pandas as pd
def _format(df):
df['Column A'] = pd.to_numeric(df['Column A'])
df['Column A Copy'] = df['Column A']
locale.setlocale(locale.LC_ALL, 'en_GB.UTF-8')
# locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
L = lambda x: locale.currency(abs(x), grouping=True)
df['Res'] = df['Column A Copy'].apply(L)
return df
print(_format(pd.DataFrame({'Column A': ['5000', '2000'], 'Column B': ['5%', '15%']})))
Column A Column B Column A Copy Res
0 5000 5% 5000 £5,000.00
1 2000 15% 2000 £2,000.00
Плавающие числа не могут быть отформатированы, поэтому вам нужно создать новый столбец со строковыми значениями, отформатированными так, как вы хотите.
Чтобы получить локаль по умолчанию для машины, на которой выполняется код, вы можете вызвать locale.setlocale с пустой строкой в качестве locale
. Затем просто отформатируйте значение с помощью locale.currency.
df = pd.DataFrame({"Column A": [5000, -2000], "Column B": ["5%", "15%"]})
locale.setlocale(locale.LC_ALL, "")
df[f"Formatted"] = df["Column A"].apply(
lambda value: (
locale.currency(value) if value >= 0 else f"-{locale.currency(abs(value))}"
)
)
Column A Column B Formatted
0 5000 5% $5000.00
1 -2000 15% -$2000.00
Если вы хотите использовать аббревиатуры международных валют вместо символов, установите international=True
:
df[f"Formatted"] = df["Column A"].apply(
lambda value: (
locale.currency(value, international=True)
if value >= 0
else f"-{locale.currency(abs(value) ,international=True)}"
)
)
Column A Column B Formatted
0 5000 5% USD 5000.00
1 -2000 15% -USD 2000.00
Это именно то, что я искал — жаль, что я не смог сделать значения плавающими для выполнения вычислений. Есть ли способ добавить пробел между знаком валюты и значением? то есть 5000,00 долларов США вместо 5000,00 долларов США для целей просмотра?
@PeterNguyen Вы можете использовать регулярное выражение: df["Formatted"].str.replace(r"(^[^\d]+)", r"\1 ", regex=True)
.
Вы не можете получить числа с плавающей запятой и валюту, почему бы вам просто не добавить дополнительный столбец с валютой?