numpy中的ndarray与pandas的Series和DataFrame之间的相互转换

简介

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

ndarray数组对象

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

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

>>> import numpy as np
>>> a = np.arange(10).reshape(2,5)
>>> print a
[[0 1 2 3 4]
 [5 6 7 8 9]]
>>> type(a)
<type 'numpy.ndarray'>
>>> a[0,1]
1
>>> a[0][1]
1
>>> a[:, ::2]
array([[0, 2, 4],
       [5, 7, 9]])
>>> a[0]
array([0, 1, 2, 3, 4])
>>> a.shape
(2L, 5L)
>>> a.dtype
dtype('int32')
>>> a.dtype.itemsize
4
多维数组的操作也非常简单,可以参考list类型对数组进行访问、切片操作。比较重要的是可以通过shape属性获取数组的维数。
我们也可以通过多维数组来标识异构的数据类型,以股票数据为例,通过dtype类来定义数据类型对象stock, 其包括日期、开盘价、收盘价、最高价、最低价、成交量及股票编码信息:
from numpy import *

if __name__ == '__main__':
    stock = dtype([('date', str_, 10), ('open', float32), ('close', float32), 
                   ('high', float32), ('low', float32), ('volume', float32), 
                   ('code', float32)])
    data = array([("2017-10-18",  11.53,  11.69,  11.70,  11.51,   871365.0,  "000001"),
                  ("2017-10-19",  11.64,  11.63,  11.72,  11.57,   722764.0,  "000001"),
                  ("2017-10-20",  11.59,  11.48,  11.59,  11.41,   461808.0,  "000001"),
                  ("2017-10-23",  11.39,  11.19,  11.40,  11.15,  1074465.0,  "000001")], 
                 dtype=stock)
     print type(data)
     print data
显示结果:

<type 'numpy.ndarray'>
[ ('2017-10-18',  11.52999973,  11.68999958,  11.69999981,  11.51000023,   871365.,  1.)
 ('2017-10-19',  11.64000034,  11.63000011,  11.72000027,  11.56999969,   722764.,  1.)
 ('2017-10-20',  11.59000015,  11.47999954,  11.59000015,  11.40999985,   461808.,  1.)
 ('2017-10-23',  11.39000034,  11.18999958,  11.39999962,  11.14999962,  1074465.,  1.)]
在实际应用中,我们很少使用ndarray来定义异构的数据类型,而是使用pandas中的Series和DataFrame来操作。

Series对象

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

from pandas import Series
if __name__ == '__main__':
    data = [
            ["2017-10-18",  11.53,  11.69,  11.70,  11.51,   871365.0,  000001],
            ["2017-10-19",  11.64,  11.63,  11.72,  11.57,   722764.0,  000001],
            ["2017-10-20",  11.59,  11.48,  11.59,  11.41,   461808.0,  000001],
            ["2017-10-23",  11.39,  11.19,  11.40,  11.15,  1074465.0,  000001]]
    series = Series(data, index=['a', 'b', 'c', 'd'])
    print series
    #将Series转换为ndarray类型
    arr = series.as_matrix()
可以调用as_matrix()将其转换为ndarray类型的对象。

DataFrame对象

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

from pandas import Series, DataFrame
from numpy import array

if __name__ == '__main__':
    data = [
            [11.53,  11.69,  11.70,  11.51,   871365.0,  000001],
            [11.64,  11.63,  11.72,  11.57,   722764.0,  000001],
            [11.59,  11.48,  11.59,  11.41,   461808.0,  000001],
            [11.39,  11.19,  11.40,  11.15,  1074465.0,  000001]]
    df = DataFrame(data, index=["2017-10-18", "2017-10-19", "2017-10-20", "2017-10-23"], 
                   columns=["open", "close", "high", "low", "volume", "code"])
    print df
    print df.as_matrix(['open', 'close'])
    print df.values
    print array(df)
这里,我们展示了3种方法将DataFrame获取ndarray类型的方法。as_matrix()方法可以指定获取的列;values属性将使用所有的列转换为ndarray对象,等同与无参数的as_matrix();array()接受将DataFrame对象作为参数创建ndarray对象。

### 回答1: 可以使用 pandas 库将多个 numpy.ndarray 转换成一个 dataframe。具体的做法是,先将每个 numpy.ndarray 转换成一个 pandasSeries,再将这些 Series 合并成一个 dataframe。 下面是示例代码: ```python import pandas as pd import numpy as np # 假设有两个 numpy.ndarray,分别为 arr1 和 arr2 arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) # 将每个 ndarray 转换成一个 Series s1 = pd.Series(arr1) s2 = pd.Series(arr2) # 将两个 Series 合并成一个 dataframe df = pd.concat([s1, s2], axis=1) # 打印输出结果 print(df) ``` 输出结果为: ``` 0 1 0 1 4 1 2 5 2 3 6 ``` ### 回答2: 要将多个numpy.ndarray转换成一个dataframe,我们可以使用pandasDataframe函数来实现。 首先,我们需要导入numpypandas库: ```python import numpy as np import pandas as pd ``` 接下来,假设我们有两个numpy数组arr1和arr2,它们的形状为(5, 3)和(5, 2)。我们可以使用numpy的vstack函数将这两个数组垂直堆叠起来,形成一个新的numpy数组: ```python new_arr = np.vstack((arr1, arr2)) ``` 然后,我们可以使用pandasDataframe函数将这个新的numpy数组转换成一个dataframe: ```python df = pd.DataFrame(new_arr) ``` 最后,我们可以通过打印dataframe来验证转换是否成功: ```python print(df) ``` 完整代码如下: ```python import numpy as np import pandas as pd arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]) arr2 = np.array([[16, 17], [18, 19], [20, 21], [22, 23], [24, 25]]) new_arr = np.vstack((arr1, arr2)) df = pd.DataFrame(new_arr) print(df) ``` 运行代码后,我们将得到一个包含8行5列的dataframe,其前5行来自arr1,后3行来自arr2。 ### 回答3: 要将多个numpy.ndarray转换成一个dataframe,可以使用pandasDataFrame函数。首先,将每个ndarray转换pandasSeries对象,然后将Series对象放入一个字典。最后,通过将字典作为参数传递给DataFrame函数,可以将所有的Series对象合并为一个DataFrame。 以下是一个示例代码,假设有两个ndarray数组arr1和arr2: import pandas as pd import numpy as np arr1 = np.array([1, 2, 3, 4, 5]) arr2 = np.array([6, 7, 8, 9, 10]) # 将每个ndarray转换Series对象 series1 = pd.Series(arr1) series2 = pd.Series(arr2) # 创建一个字典,将Series对象放入其 data = {'arr1': series1, 'arr2': series2} # 通过字典创建一个DataFrame df = pd.DataFrame(data) 这样,就将arr1和arr2两个ndarray转换为了一个DataFrame对象dfDataFrame将每个ndarray视为一列,列名分别为arr1和arr2。可以通过df来访问和操作这些数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值