如何设置np.arange()生成的列名的精度?

时间:2019-06-11 14:00:57

标签: python pandas numpy

我制作了数据框,并使用np.arange()设置了列名。但是,有时(而不是确切的数字)会将其设置为0.300000004之类的数字。

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

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

这是我的函数的return语句:

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)

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

1 个答案:

答案 0 :(得分:0)

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

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