使用pandas.dataframe.values将panda数据帧转换为numpy数组

问题描述 投票:0回答:2

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

在此先感谢您的帮助

                   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
python pandas numpy
2个回答
0
投票

你可以用NumPy structured arrays做到这一点。我将创建一个只有2行和2列类似于您的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记录数组显然比结构化数组慢!


0
投票

Numpy arrays具有统一的数据类型,您可以从文档中看到:

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

offset = 0,strides = None,order = None)[source]数组对象表示固定大小的项目的多维同构数组。关联的数据类型对象描述数组中每个元素的格式(其字节顺序,它在内存中占用的字节数,是整数,浮点数还是其他等),等等。

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

pandas.DataFrame.values还提到:

笔记

dtype将是一个较低的共同分母dtype(隐式向上转换);也就是说,如果dtypes(甚至是数字类型)混合在一起,那么将选择容纳所有dtypes的那个。如果您不处理块,请小心使用它。

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

© www.soinside.com 2019 - 2024. All rights reserved.