Python中使用Pandas绘制Decimal类型超长数值的报错解决方法
解决Pandas中Decimal类型数据绘图报错问题
报错TypeError: no numeric data to plot的核心原因是:matplotlib不支持直接绘制decimal.Decimal类型的数据,Pandas的plot方法依赖matplotlib,因此无法识别该类型为数值数据。
以下是几种可行的解决方法:
方法一:转换为Python原生数值类型
如果你的数值在float精度范围内(不会丢失精度),可以直接将Decimal列转换为float类型:
import pandas as pd import matplotlib.pyplot as plt import decimal as dec obs={} dec.getcontext().prec=10 obs['x']=[dec.Decimal(1),dec.Decimal(2),dec.Decimal(3)] obs['y']=[dec.Decimal(1),dec.Decimal(2),dec.Decimal(3)] df=pd.DataFrame(data=obs) # 转换Decimal列为float类型 df['x'] = df['x'].apply(lambda x: float(x)) df['y'] = df['y'].apply(lambda x: float(x)) df.plot(x='x',y='y',marker='*') plt.show()
方法二:使用pd.to_numeric批量转换
pd.to_numeric可以自动识别Decimal类型并转换为合适的数值类型,写法更简洁:
import pandas as pd import matplotlib.pyplot as plt import decimal as dec obs={} dec.getcontext().prec=10 obs['x']=[dec.Decimal(1),dec.Decimal(2),dec.Decimal(3)] obs['y']=[dec.Decimal(1),dec.Decimal(2),dec.Decimal(3)] df=pd.DataFrame(data=obs) # 批量转换所有Decimal列为数值类型 df = df.apply(pd.to_numeric) df.plot(x='x',y='y',marker='*') plt.show()
方法三:针对超长科学计数法的高精度转换
如果处理的超长科学计数法数值超出float精度范围,可以转换为numpy的longdouble类型以保留更高精度:
import pandas as pd import matplotlib.pyplot as plt import decimal as dec import numpy as np obs={} dec.getcontext().prec=20 obs['x']=[dec.Decimal('1e300'),dec.Decimal('2e300'),dec.Decimal('3e300')] obs['y']=[dec.Decimal('1e300'),dec.Decimal('2e300'),dec.Decimal('3e300')] df=pd.DataFrame(data=obs) # 转换为numpy longdouble类型 df['x'] = df['x'].apply(lambda x: np.longdouble(x)) df['y'] = df['y'].apply(lambda x: np.longdouble(x)) df.plot(x='x',y='y',marker='*') plt.show()
内容的提问来源于stack exchange,提问作者Stéphane
相关产品推荐
相关产品推荐

