我有一个数据框,如下所示。我想让它成为一个数组。当我使用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
numpy数组具有统一的数据类型,您可以从文档中看到:
numpy.ndarray class numpy.ndarray(shape,dtype = float,buffer = none,
offset = 0,步幅= none,order = none)[源]数组对象代表固定大小项目的多维同质阵列。一个关联的数据类型对象描述了每个元素的格式数组(其字节订单,它在内存中占有多少个字节,无论是整数,浮点数还是其他东西,等)
当您使用df.values时,它将将所有值投放到最合适的数据类型以保持同质性。
pandas.dataframe.values也提到:
注释
dtype将是一个较低的contemoinator dtype(隐式升级);也就是说,是否dtypes(甚至数字类型)混合,将选择所有容纳所有人的人。使用此注意如果您不处理块。
例如。如果dtypes为float16和float32,则DTYPE将会升至float32。如果DTYPES为INT32和UINT8,则DTYPE将升至INT32。由numpy.find_common_type()约定,混合int64和uint64将导致float64 dtype。
您可以使用numpy结构化数组进行操作。我将创建一个只有2行和2列与您的数据框架,以说明如何使用任何大小的数据框架进行操作。
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.rec.array
创建np.recarray
类。这几乎与仅有一个额外功能的结构化阵列相同。您可以作为属性访问字段,即array.col1
而不是array['col1']
。但是,Numpy记录阵列显然比结构化数组慢!