使用pandas.dataframe.values

时间:2019-03-10 01:44:25

标签: python pandas numpy

我有一个如下数据框。我想使其成为一个numpy数组。 当我使用df.values命令时,它作为numpy数组,但所有属性都转换为float。我查看了df.values文档,但没有帮助,我可以将相同的df数据类型分配给numpy吗?

预先感谢您的帮助

                   High          Low  ...      Volume    Adj Close
Date                                  ...                         
2018-12-20  2509.629883  2441.179932  ...  5585780000  2467.419922
2018-12-21  2504.409912  2408.550049  ...  7609010000  2416.620117
2018-12-24  2410.340088  2351.100098  ...  2613930000  2351.100098
2018-12-26  2467.760010  2346.580078  ...  4233990000  2467.699951
2018-12-27  2489.100098  2397.939941  ...  4096610000  2488.830078
2018-12-28  2520.270020  2472.889893  ...  3702620000  2485.739990
2018-12-31  2509.239990  2482.820068  ...  3442870000  2506.850098
2019-01-02  2519.489990  2467.469971  ...  3733160000  2510.030029

2 个答案:

答案 0 :(得分:0)

从文档中可以看到,

Numpy arrays具有统一的数据类型:

  

numpy.ndarray类numpy.ndarray(shape,dtype = float,buffer = None,

     

offset = 0,步幅=无,顺序=无)[源代码]数组对象表示   固定尺寸项目的多维,均匀阵列。一个   关联的数据类型对象描述了每个元素的格式   数组(字节顺序,在内存中占用多少字节,   无论是整数,浮点数还是其他,   等)

使用df.values时,它将所有值转换为最合适的数据类型以保持同质性。

pandas.DataFrame.values还提到:

  

注释

     

dtype将是一个较低的公分母dtype(隐式   cast)也就是说,如果dtypes(甚至是数字类型)是   混合,将容纳所有。搭配使用   关心是否不处理这些块。

     

例如如果dtype是float16和float32,则dtype将被向上转换为   float32。如果dtype是int32和uint8,则dtype将被转换为int32。   根据numpy.find_common_type()约定,将int64和uint64混合将   导致float64 dtype。

答案 1 :(得分:0)

您可以使用NumPy structured arrays完成此操作。 我将创建一个只有两行和两列与您相似的DataFrame,以演示如何使用任意大小的DataFrame。

import Pandas as pd
import Numpy as np

df = pd.DataFrame({'High': [2509.629883, 2504.409912], 
                   'Volume': [5585780000, 7609010000]}, 
                  index=np.array(['2018-12-20', '2018-12-21'], dtype='datetime64'))

然后创建一个空的NumPy数组,定义每个列必须具有的数据类型。在我的示例中,我只有2行,因此该数组将只有2行,如下所示:

array = np.empty(2, dtype={'names':('col1', 'col2', 'col3'),
                          'formats':('datetime64[D]', 'f8', 'i8')})

array['col1'] = df.index
array['col2'] = df['High']
array['col3'] = df['Volume']

,数组将如下所示:

array([('2018-12-20', 2509.629883, 5585780000),
       ('2018-12-21', 2504.409912, 7609010000)],
      dtype=[('col1', '<M8[D]'), ('col2', '<f8'), ('col3', '<i8')])

您还可以使用命令np.recarray创建np.rec.array类。这与仅具有一项额外功能的结构化阵列几乎相同。您可以访问字段作为属性,即array.col1而不是array['col1']。但是,numpy记录数组显然比结构化数组慢!