首页 > 解决方案 > 如何设置由 np.arange() 生成的列名的精度?

问题描述

我制作了数据框并使用np.arange(). 但是,它(有时)将它们设置为像 0.300000004 这样的数字,而不是确切的数字。

我尝试了舍入整个数据框并使用np.around()输出np.arange(),但这些似乎都不起作用。我还尝试在顶部添加这些:

np.set_printoptions(suppress=True)
np.set_printoptions(precision=3)

这是我的函数的返回语句:

stepT = 0.1
%net is some numpy array
return pd.DataFrame(net, columns = np.arange(0,1+stepT, stepT),
                    index = np.around(np.arange(0,1+stepS,stepS),decimals = 3)).round(3)

是否有任何功能可以让我将这些名称作为逗号后只有一位数字的数字?

标签: pythonpandasnumpy

解决方案


浮点数的明显不精确性经常出现。

In [689]: np.arange(0,1+stepT, stepT)                                                                  
Out[689]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
In [690]: _.tolist()                                                                                   
Out[690]: 
[0.0,
 0.1,
 0.2,
 0.30000000000000004,
 0.4,
 0.5,
 0.6000000000000001,
 0.7000000000000001,
 0.8,
 0.9,
 1.0]
 In [691]: _689[3]                                                                                      
 Out[691]: 0.30000000000000004

numpy 打印选项控制数组的显示方式。但是在打印单个值时它们不起作用。

当我使用此列规范制作数据框时,我得到了很好的显示。(_689Out[689]数组的 ipython 简写。)它使用数组格式:

In [699]: df = pd.DataFrame(np.arange(11)[None,:], columns=_689)                                       
In [700]: df                                                                                           
Out[700]: 
   0.0  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0
0    0    1    2    3    4    5    6    7    8    9   10
In [701]: df.columns                                                                                   
Out[701]: 
Float64Index([                0.0,                 0.1,                 0.2,
              0.30000000000000004,                 0.4,                 0.5,
               0.6000000000000001,  0.7000000000000001,                 0.8,
                              0.9,                 1.0],
             dtype='float64')

但是像这样选择带有浮点数的列是很棘手的。有些工作,有些不工作。

In [705]: df[0.4]                                                                                      
Out[705]: 
0    4
Name: 0.4, dtype: int64

In [707]: df[0.3]                                                                                      
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)

看起来它正在做某种字典查找。浮点数不能很好地解决这个问题,因为它们固有的不精确性。

对 进行相等性测试arange

In [710]: _689[3]==0.3                                                                                 
Out[710]: False
In [711]: _689[4]==0.4                                                                                 
Out[711]: True

我认为您应该从 中创建一个格式正确的字符串列表arange,并将其用作列标题,而不是浮点数本身。

例如:

In [714]: alist = ['%.3f'%i for i in _689]                                                             
In [715]: alist                                                                                        
Out[715]: 
['0.000',
 '0.100',
 '0.200',
 '0.300',
 '0.400',
 '0.500',
 '0.600',
 '0.700',
 '0.800',
 '0.900',
 '1.000']
In [716]: df = pd.DataFrame(np.arange(11)[None,:], columns=alist)                                      
In [717]: df                                                                                           
Out[717]: 
   0.000  0.100  0.200  0.300  0.400  0.500  0.600  0.700  0.800  0.900  1.000
0      0      1      2      3      4      5      6      7      8      9     10
In [718]: df.columns                                                                                   
Out[718]: 
Index(['0.000', '0.100', '0.200', '0.300', '0.400', '0.500', '0.600', '0.700',
       '0.800', '0.900', '1.000'],
      dtype='object')
In [719]: df['0.300']                                                                                  
Out[719]: 
0    3
Name: 0.300, dtype: int64

推荐阅读