如何将Pandas数据框中的数值转换为百万/千位字符串格式?
解决Pandas中数值转百万/千格式的问题
问题场景
现有如下Pandas数据框:
import pandas as pd df = pd.DataFrame([[3000000, 2500000, 1800000, 800000, 500000]], columns=['Market value'])
需要将Market value列的数值转换为带欧元符号、百万(M)/千(K)的格式,期望转换结果如下:
- 3000000 -> €3M
- 2500000 -> €2.5M
- 1800000 -> €1.8M
- 800000 -> €800K
- 500000 -> €500K
尝试的代码及问题
尝试了以下代码:
import numpy as np df['Market Value'] = np.select(condlist = [(df['Market value']/1000) >= 1000], choicelist = ['€'+(df['Market value'].astype(float)/1000000).astype(int).astype(str) + 'M'], default = '€'+(df['Market value'].astype(float)/1000).astype(int).astype(str) + 'K')
但输出不符合预期:
- 2500000 输出为€2M(期望€2.5M)
- 1800000 输出为€1M(期望€1.8M)
问题根源是代码中使用.astype(int)直接截断了小数部分,丢失了精度。
解决方案
方法1:自定义函数+apply
通过自定义格式化函数,保留必要的小数位,并处理整数情况:
def format_value(val): if val >= 1000000: # 格式化为1位小数,去掉末尾的.0 return f"€{val/1000000:.1f}M".replace(".0", "") else: return f"€{val/1000:.0f}K" df['Market Value'] = df['Market value'].apply(format_value)
方法2:改进np.select实现
用格式化字符串替代类型转换,避免丢失小数:
import numpy as np df['Market Value'] = np.select( condlist=[df['Market value'] >= 1000000], choicelist=[df['Market value'].apply(lambda x: f"€{x/1000000:.1f}M".replace(".0", ""))], default=df['Market value'].apply(lambda x: f"€{x/1000:.0f}K") )
两种方法都能得到符合预期的结果:
| Market value | Market Value |
|---|---|
| 3000000 | €3M |
| 2500000 | €2.5M |
| 1800000 | €1.8M |
| 800000 | €800K |
| 500000 | €500K |
内容的提问来源于stack exchange,提问作者codemachine
相关产品推荐
相关产品推荐

