我有一个如下数据框。我想使其成为一个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
答案 0 :(得分:0)
Numpy arrays具有统一的数据类型:
numpy.ndarray类numpy.ndarray(shape,dtype = float,buffer = None,
offset = 0,步幅=无,顺序=无)[源代码]数组对象表示 固定尺寸项目的多维,均匀阵列。一个 关联的数据类型对象描述了每个元素的格式 数组(字节顺序,在内存中占用多少字节, 无论是整数,浮点数还是其他, 等)
使用df.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记录数组显然比结构化数组慢!