如何在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
相关产品推荐
相关产品推荐

