python 的数据分析包中提供了一系列强大的数据结构,本文将对三个最重要的数据结构进行介绍。
本文参考内容:
Coursera 上学完的 《用 Python 玩转数据分析》 Pandas 官网的 10 分钟入门 NumPy 中的基本数据结构 ndarrayndarray 是 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 的人都不陌生,这就是数据透视表功能