如何在将数据帧转换为numpy数组时设置dtypes?

时间:2018-03-17 13:28:02

标签: python pandas numpy

我有一个看起来像这样的numpy结构化数组:

>>> arr
array([(b'00:59:59.785634', 60.87), (b'01:00:00.187634', 60.88),
    (b'01:00:00.188634', 60.88), ...,
    (b'23:59:58.668559', 60.93), (b'23:59:58.668559', 60.92),
    (b'23:59:58.668559', 60.93)],
    dtype=[('Date', 'S15'), ('Value', '<f4')])

当我将其转换为pandas数据框时,Value列的值会更改其形式。

>>> df = pd.DataFrame( arr )
                    Date      Value  
0       b'00:59:59.785634'  60.869999     
1       b'01:00:00.187634'  60.880001    
2       b'01:00:00.188634'  60.880001     
3       b'01:00:00.189634'  60.860001    
4       b'01:00:00.190634'  60.860001  

>>> df.Value
Name: Value, Length: 176195, dtype: float32    

它仍然可以,因为它打印出与数组相同的值。

>>> str( df['Value'][0] )
'60.87'

但是当我修改数据帧并尝试将数据帧再次转换为数组时会出现问题。

>>> new_arr = df.values
array([[b'00:59:59.785634', 60.869998931884766],
    [b'01:00:00.187634', 60.880001068115234],
    [b'01:00:00.188634', 60.880001068115234],
    ...,
    [b'23:59:58.668559', 60.93000030517578],
    [b'23:59:58.668559', 60.91999816894531],
    [b'23:59:58.668559', 60.93000030517578]], dtype=object)

>>> str( new_arr[0][1] )
'60.869998931884766'        # != '60.87'

我认为原始dtype(float32)在上次转换过程中丢失了。即使将数据帧转换为具有'60.87'属性的数组,我仍然可以获得.values吗?

我的问题是为什么它打印出不同的结果('60 .87'和'60 .869998931884766')以及如何保持类型。我认为如果在将数组转换为数据帧时值可以相同,那么应该有一些方法可以在转换它们时保留这些值反过来

0 个答案:

没有答案