如何格式化Pandas DataFrame数值,消除科学计数法并添加指定格式
Pandas DataFrame 格式化输出:添加美元符号、百分号与千分位分隔符
问题需求
需要将Pandas DataFrame的输出从科学计数法转换为指定样式,要求数值包含美元符号、百分号、千分位分隔符,具体场景如下:
原代码
import requests import pandas as pd url = "https://coinmarketcap.com/new/" page = requests.get(url,headers={'User-Agent': 'Mozilla/5.0'}, timeout=1) pagedata = page.text usecols = ["Name", "Price", "1h", "24h", "MarketCap", "Volume"]#, "Blockchain"] df = pd.read_html(pagedata)[0] #Checking table df[["Name", "Symbol"]] = df["Name"].str.split(r"\d+", expand=True) df = df.rename(columns={"Fully Diluted Market Cap": "MarketCap"})[usecols] numcols = df.columns[df.columns != 'Name'] df[numcols] = df[numcols].apply(lambda c:pd.to_numeric(c.str.replace(r'[^\d.]|(?<!\d)\.|\.(?!\d)', '', regex=True))) df = df.sort_values('24h', ascending=False) print (df)
当前输出(科学计数法)
Name Price 1h 24h MarketCap Volume 0 DollarPepe 4.402000e-02 16.87 597.88 4.000000e+00 541219 12 Perry The BNB 5.442000e-08 2.90 519.49 1.144662e+07 25606468 2 JEFF 1.802000e-01 3.66 202.07 1.802032e+07 21195038 19 KEK 5.665000e-08 57.52 154.52 4.405980e+06 5925829 16 FlokiPepe 2.836000e-09 34.48 118.71 1.193154e+06 1394199 1 Billy Token 3.168000e-05 11.69 72.83 2.198928e+06 5389786
期望输出(带指定格式)
Name Price 1h 24h MarketCap Volume 0 DollarPepe $0.04 $17.72% 16.87% $586.08 $4.0 12 Perry The BNB $0.00 $2.66% $557% $12,086,284.00 $25,525,925 2 JEFF $0.18 $1.91% $194% $17,541,936.00 $21,178,793 19 KEK $0.00 $57.80% $221% $5,560,854.00 $5,864,987 16 FlokiPepe $0.00 $22.75% $110% $1,132,337.00 $1,382,867 1 Billy Token $0.00 $14.31% $72% $2,235,948.00 $5,405,861
解决方案
通过全局关闭科学计数法,再针对不同列设置专属格式化规则,即可实现需求。修改后的完整代码如下:
import requests import pandas as pd # 全局关闭科学计数法显示 pd.options.display.float_format = '{:.2f}'.format url = "https://coinmarketcap.com/new/" page = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=1) pagedata = page.text usecols = ["Name", "Price", "1h", "24h", "MarketCap", "Volume"] df = pd.read_html(pagedata)[0] df[["Name", "Symbol"]] = df["Name"].str.split(r"\d+", expand=True) df = df.rename(columns={"Fully Diluted Market Cap": "MarketCap"})[usecols] numcols = df.columns[df.columns != 'Name'] df[numcols] = df[numcols].apply(lambda c: pd.to_numeric(c.str.replace(r'[^\d.]|(?<!\d)\.|\.(?!\d)', '', regex=True))) df = df.sort_values('24h', ascending=False) # 针对各列设置格式化规则 styled_df = df.style.format({ 'Price': '${:.2f}', # 美元格式,保留2位小数 '1h': '${:.2f}%', # 带美元符号的百分比 '24h': '{:.2f}%', # 纯百分比格式 'MarketCap': '${:,.2f}', # 千分位分隔符+美元符号,保留2位小数 'Volume': '${:,.0f}' # 千分位分隔符+美元符号,不保留小数 }) # 打印格式化后的结果 print(styled_df.to_string())
关键说明
pd.options.display.float_format = '{:.2f}'.format:全局禁用科学计数法,确保数值以常规浮点数形式显示。style.format方法:为每一列定义专属格式规则,适配不同数据类型的展示需求:- 价格类列(Price):添加美元符号并控制小数位数
- 涨幅类列(1h/24h):添加百分号,按需求调整符号位置
- 市值/成交量列(MarketCap/Volume):添加千分位分隔符,提升大数值可读性
- 若需要显示更多小数位数(如极小价格),可修改格式字符串中的数字,例如将
{:.2f}改为{:.8f}。
内容的提问来源于stack exchange,提问作者Drew Duazeh
相关产品推荐
相关产品推荐

