Python 的数据分析包中提供了一系列强大的数据结构,本文将对三个最重要的数据结构进行介绍。
本文参考内容:

NumPy 中的基本数据结构 ndarray

ndarray 是 NumPy 的基石,它有哪些好处呢?

  • 对于大计算量的性能非常好,所以 list 做运算的时候一定要转化为 array
  • ndarray 自带一些非常实用的函数,列举几个常用的:sum,shape(返回当前矩阵给的纬度)、argmax 等

具体案例:

In[1]: import numpy as np

In[2]: a_array = np.array([[1,2,3], [1,2,3]])  #创建 ndarray

In[3]: b_array = np.array([(2,2,2), (5,5,5)])

In[4]: a_array.shape   #获取数组的维度
Out[4]: (2, 3)

In[5]: a_array * b_array   #数组相乘
Out[5]:
array([[ 2,  4,  6], [ 5, 10, 15]])

In[6]: a_array > 3     #判断数组中是否每个都大于 3
Out[6]:
array([[False, False, False], [False, False, False]], dtype=bool)

In[7]: np.sin(a_array)     #求数组中每个数字的 sin 值
Out[7]:
array([[ 0.84147098,  0.90929743,  0.14112001], [ 0.84147098,  0.90929743,  0.14112001]])

In[8]: a_array.sum()       #求数组中各项相加的和
Out[8]: 12

In[9]: a_array.sum(axis = 0)   #求数组中每一列的值的和
Out[9]: array([2, 4, 6])

变长字典 Series

基本特征

  • 类似一维数组的对象
  • 由数据和索引组成

具体案例:

In[1]: import pandas as pd

In[2]: a_series = pd.Series([1, 2, 3])     #创建索引

In[3]: a_series
Out[3]:
0    1
1    2
2    3
dtype: int64

In[4]: b_series = pd.Series(['apple', 'banana', 'lemon'], index = [1, 'b', 'l'])       #自定义索引

In[5]: b_series
Out[5]:
1     apple
b    banana
l     lemon
dtype: object

In[6]: b_series['l']   #利用索引获取值
Out[6]: 'lemon'

In[7]: print a_series * 2    #基本运算符,对每个值进行计算
0    2
1    4
2    6
dtype: int64

In[8]: import numpy as np

In[9]: np.exp(a_series)      #指数函数运算
Out[9]:
0     2.718282
1     7.389056
2    20.085537
dtype: float64

数据对齐

In[1]: import pandas as pd

In[2]: data = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}

In[3]: index = ['Ohio', 'Texas', 'Utah']

In[4]: a_series = pd.Series(data, index = index)   #创建指定 index 的 Series

In[5]: a_series
Out[5]:
Ohio     35000
Texas    71000
Utah      5000
dtype: int64

In[6]: pd.isnull(a_series)
Out[6]:
Ohio     False
Texas    False
Utah     False
dtype: bool

In[7]: b_data = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'California': 83000, 'Nevada': 15000}

In[8]: b_series = pd.Series(b_data)

In[9]: a_series + b_series #在数据运算中自动对齐不同索引的数据
Out[9]:
California         NaN
Nevada             NaN
Ohio           70000.0
Oregon             NaN
Texas         142000.0
Utah               NaN
dtype: float64

表格型数据结构 DataFrame

基本特征

  • 一个表格型的数据结构
  • 含有一组有序的列(类似 index)
  • 拥有多个列的数据表,每个列拥有一个 Label(类似 excel 的表头)
  • 大致可以看成共享一个 index 的 Series 集合

具体案例:

In[1]: import pandas as pd

In[2]: import numpy as np

In[3]: dates = pd.date_range('20161007', periods=6)

In[4]: dates
Out[4]:
DatetimeIndex(['2016-10-07', '2016-10-08', '2016-10-09', '2016-10-10','2016-10-11', '2016-10-12'],dtype='datetime64[ns]', freq='D')

In[5]: df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))    #创建一个 DataFrame

In[6]: df
Out[6]:
                A       B       C       D
2016-10-07  2.437131  0.004184 -0.204022 -0.395558
2016-10-08  0.988348 -0.346398  0.190402  3.268118
2016-10-09 -1.574105  1.491294  0.597307 -0.944745
2016-10-10 -2.362435  0.620811  1.807417  0.345957
2016-10-11 -0.091778  1.408165 -0.121032  0.528897
2016-10-12 -1.319251  0.698142 -1.366151 -0.523682

In[7]: df.dtypes   #获取 DataFrame 的数据结构类型
Out[7]:
A    float64
B    float64
C    float64
D    float64
dtype: object

In[8]: df['A']     #根据列名获取 DataFrame 中的一列,结构为 Series
Out[8]:
2016-10-07    2.437131
2016-10-08    0.988348
2016-10-09   -1.574105
2016-10-10   -2.362435
2016-10-11   -0.091778
2016-10-12   -1.319251
Freq: D, Name: A, dtype: float64

In[9]: df.ix[2]    #获取某一行的数据,结构为 Series
Out[9]:
A   -1.574105
B    1.491294
C    0.597307
D   -0.944745
Name: 2016-10-09 00:00:00, dtype: float64

In[10]: df.head(2)     #获取前两行的数据
Out[10]:
                   A         B         C         D
2016-10-07  2.437131  0.004184 -0.204022 -0.395558
2016-10-08  0.988348 -0.346398  0.190402  3.268118

In[11]: df.T           #数据表转置运算
Out[11]:
   2016-10-07  2016-10-08  2016-10-09  2016-10-10  2016-10-11  2016-10-12
A    2.437131    0.988348   -1.574105   -2.362435   -0.091778   -1.319251
B    0.004184   -0.346398    1.491294    0.620811    1.408165    0.698142
C   -0.204022    0.190402    0.597307    1.807417   -0.121032   -1.366151
D   -0.395558    3.268118   -0.944745    0.345957    0.528897   -0.523682

In[12]: df.sort_values(by='B')     #根据 B 序列排序
Out[12]:
               A        B       C      D
2016-10-08  0.988348 -0.346398  0.190402  3.268118
2016-10-07  2.437131  0.004184 -0.204022 -0.395558
2016-10-10 -2.362435  0.620811  1.807417  0.345957
2016-10-12 -1.319251  0.698142 -1.366151 -0.523682
2016-10-11 -0.091778  1.408165 -0.121032  0.528897
2016-10-09 -1.574105  1.491294  0.597307 -0.944745

In[16]: del df['A']

In[17]: df
Out[17]:
                B       C       D
2016-10-07  0.004184 -0.204022 -0.395558
2016-10-08 -0.346398  0.190402  3.268118
2016-10-09  1.491294  0.597307 -0.944745
2016-10-10  0.620811  1.807417  0.345957
2016-10-11  1.408165 -0.121032  0.528897
2016-10-12  0.698142 -1.366151 -0.523682

DataFrame 强大的功能还有很多,包括:

  • 通过标签选择数据,比如:df.loc['20130102':'20130104',['A','B']]
  • 设置表格的值,df.at[dates[0],'A'] = 0
  • 统计运算,df.mean() 求平均值
  • 拼接,Merge、ConCat、Join(和 SQL 里的 Join 是一个意思)
  • Grouping,和 SQL 中的 Group By 类似
  • Pivot Tables,会使用 excel 的人都不陌生,这就是数据透视表功能
Comments
Write a Comment