numpy中的ndarray与pandas的Series和DataFrame之间的区别

在数据分析中,经常涉及numpy中的ndarray对象与pandas的Series和DataFrame对象之间的转换,让大家产生困惑。本文将简单介绍这三种数据类型,并以股票信息为例,给出相关对象之间转换的具体示例。

ndarray数组对象

NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:

  • 实际的数据;
  • 描述这些数据的元数据。

大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据。NumPy数组一般是同质的(但有一种特殊的数组类型例外,它是异质的),即数组中的所有元素类型必须是一致的。这样有一个好处:如果我们知道数组中的元素均为同一类型,该数组所需的存储空间就很容易确定下来。

我们举一个简单的多维数组的例子。在这里,我们使用Numpy提供的arange函数来来方便的创建一维数组,其函数原型为arange([start,] stop[, step,], dtype=None)。可以指定起始值、结束值、步长及数据类型参数,这里步长参数为整数值。如果要使用非整数值的步长,可以考虑使用linespace函数。通过reshape()函数将一维数组转换为多维数组。

 

 
  1. >>> import numpy as np

  2. >>> a = np.arange(10).reshape(2,5)

  3. >>> print a

  4. [[0 1 2 3 4]

  5. [5 6 7 8 9]]

  6. >>> type(a)

  7. >>> a[0,1]

  8. 1

  9. >>> a[0][1]

  10. 1

  11. >>> a[:, ::2]

  12. array([[0, 2, 4],

  13. [5, 7, 9]])

  14. >>> a[0]

  15. array([0, 1, 2, 3, 4])

  16. >>> a.shape

  17. (2L, 5L)

  18. >>> a.dtype

  19. dtype('int32')

  20. >>> a.dtype.itemsize

  21. 4

多维数组的操作也非常简单,可以参考list类型对数组进行访问、切片操作。比较重要的是可以通过shape属性获取数组的维数。
我们也可以通过多维数组来标识异构的数据类型,以股票数据为例,通过dtype类来定义数据类型对象stock, 其包括日期、开盘价、收盘价、最高价、最低价、成交量及股票编码信息:

 
  1. from numpy import *

  2.  
  3. if __name__ == '__main__':

  4. stock = dtype([('date', str_, 10), ('open', float32), ('close', float32),

  5. ('high', float32), ('low', float32), ('volume', float32),

  6. ('code', float32)])

  7. data = array([("2017-10-18", 11.53, 11.69, 11.70, 11.51, 871365.0, "000001"),

  8. ("2017-10-19", 11.64, 11.63, 11.72, 11.57, 722764.0, "000001"),

  9. ("2017-10-20", 11.59, 11.48, 11.59, 11.41, 461808.0, "000001"),

  10. ("2017-10-23", 11.39, 11.19, 11.40, 11.15, 1074465.0, "000001")],

  11. dtype=stock)

  12. print type(data)

  13. print data

显示结果:

 

 
  1. [ ('2017-10-18', 11.52999973, 11.68999958, 11.69999981, 11.51000023, 871365., 1.)

  2. ('2017-10-19', 11.64000034, 11.63000011, 11.72000027, 11.56999969, 722764., 1.)

  3. ('2017-10-20', 11.59000015, 11.47999954, 11.59000015, 11.40999985, 461808., 1.)

  4. ('2017-10-23', 11.39000034, 11.18999958, 11.39999962, 11.14999962, 1074465., 1.)]

在实际应用中,我们很少使用ndarray来定义异构的数据类型,而是使用pandas中的Series和DataFrame来操作。

Series对象

从一般意义上来讲, Series 可以简单地被认为是一维的数组。 Series 和一维数组最主要的区别在于 Series 类型具有索引( index )。Series支持从列表和字典创建,这里仅举以列表创建的例子:

 

 
  1. from pandas import Series

  2. if __name__ == '__main__':

  3. data = [

  4. ["2017-10-18", 11.53, 11.69, 11.70, 11.51, 871365.0, 000001],

  5. ["2017-10-19", 11.64, 11.63, 11.72, 11.57, 722764.0, 000001],

  6. ["2017-10-20", 11.59, 11.48, 11.59, 11.41, 461808.0, 000001],

  7. ["2017-10-23", 11.39, 11.19, 11.40, 11.15, 1074465.0, 000001]]

  8. series = Series(data, index=['a', 'b', 'c', 'd'])

  9. print series

  10. #将Series转换为ndarray类型

  11. arr = series.as_matrix()

可以调用as_matrix()将其转换为ndarray类型的对象。

DataFrame对象

DataFrame 是将数个 Series 按列合并而成的二维数据结构,每一列单独取出来是一个 Series ,这和SQL数据库中取出的数据是很类似的。所以,按列对一个 DataFrame 进行处理更为方便,用户在编程时注意培养按列构建数据的思
维。 DataFrame 的优势在于可以方便地处理不同类型的列,因此,就不要考虑如何对一个全是浮点数的 DataFrame 求逆之类的问题了,处理这种问题还是把数据存成NumPy的 matrix 类型比较便利一些。
我们仍平安银行的例子,创建DataFrame对象,这里把日期提取出来作为index,同时指定了列名。

 
  1. from pandas import Series, DataFrame

  2. from numpy import array

  3.  
  4. if __name__ == '__main__':

  5. data = [

  6. [11.53, 11.69, 11.70, 11.51, 871365.0, 000001],

  7. [11.64, 11.63, 11.72, 11.57, 722764.0, 000001],

  8. [11.59, 11.48, 11.59, 11.41, 461808.0, 000001],

  9. [11.39, 11.19, 11.40, 11.15, 1074465.0, 000001]]

  10. df = DataFrame(data, index=["2017-10-18", "2017-10-19", "2017-10-20", "2017-10-23"],

  11. columns=["open", "close", "high", "low", "volume", "code"])

  12. print df

  13. print df.as_matrix(['open', 'close'])

  14. print df.values

  15. print array(df)

这里,我们展示了3种方法将DataFrame获取ndarray类型的方法。as_matrix()方法可以指定获取的列;values属性将使用所有的列转换为ndarray对象,等同与无参数的as_matrix();array()接受将DataFrame对象作为参数创建ndarray对象。

你可能感兴趣的:(pandas)