You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas DataFrame中保留分数避免自动转为浮点数

numpy数组转DataFrame保留分数格式实现方法

问题复现

直接用/书写分数创建numpy数组再转DataFrame时,分数会自动转为浮点数,无法保留分数形式,原代码如下:

import numpy as np
import pandas as pd

row=["A","B"]
col=["X1","X2"]
my_array=np.array([[1/3,2/5],[4/7,1/6]])
df = pd.DataFrame(data = my_array, 
                index = row, 
                columns = col)
print(my_array)
print(df)

运行输出:

[[0.33333333 0.4       ]
 [0.57142857 0.16666667]]
         X1        X2
A  0.333333  0.400000
B  0.571429  0.166667

出现这个现象的核心原因是:Python 3中/执行的是浮点数除法,1/3这类表达式在传入numpy数组前就已经被计算为浮点数,数组本身存储的就是浮点值,转DataFrame自然无法还原为分数格式。

实现方案

根据使用场景,有两种可行方案:

方案1:用Fraction类型存储精确分数(推荐)

Python标准库fractions提供的Fraction类型可以存储精确的有理分数值,pandas原生支持该类型,转DataFrame时会自动显示为分子/分母的分数形式,同时保留数值运算能力。
实现代码:

import numpy as np
import pandas as pd
from fractions import Fraction

row = ["A", "B"]
col = ["X1", "X2"]
# 传入Fraction对象创建数组,参数为(分子, 分母)
my_array = np.array([
    [Fraction(1, 3), Fraction(2, 5)],
    [Fraction(4, 7), Fraction(1, 6)]
])
df = pd.DataFrame(data=my_array, index=row, columns=col)
print(df)

运行输出:

X1   X2
A  1/3  2/5
B  4/7  1/6

方案2:用字符串存储分数文本(仅适合纯展示场景)

如果不需要对分数做数值计算,只需要显示为分数格式,可以直接把分数写为字符串传入数组,实现代码:

my_array = np.array([["1/3", "2/5"], ["4/7", "1/6"]])
df = pd.DataFrame(data=my_array, index=row, columns=col)

两种方案的差异:

  • Fraction类型方案:存储精确数值,支持加减乘除、约分等数值操作,是通用场景的首选
  • 字符串方案:仅保留文本显示效果,单元格值为字符串类型,无法直接做数值运算,仅适合不需要计算的纯报表展示场景

内容的提问来源于stack exchange,提问作者adfdsfsdf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:15:28