pandas基于numpy进行开发,是python数据分析的核心包,针对结构化数据,提供了一系列灵活且强大的数据分析功能。在pandas中,提供了以下两种基本的数据结构Series
DataFrame
熟悉R的朋友,理解这两个概念非常简单,Series是一维结构,且带有标签,其中的元素都是同种类型,类比R语言中的向量,而DataFrame从名字看更加直观,类比R语言中的data.frame数据框,DataFrame的每一列其实就是一个Series对象。Series对象示例如下 >>> import pandas as pd >>> import numpy as np >>> s = pd.Series([1, 2, 3, np.nan, 5]) >>> s 0 1.0 1 2.0 2 3.0 3 NaN 4 5.0 dtype: float64 # name参数指定series的名称 >>> s = pd.Series(data=[1, 2, 3, np.nan, 5],name='A') >>> s 0 1.0 1 2.0 2 3.0 3 NaN 4 5.0 Name: A, dtype: float64
# data参数指定数据 # index参数指定标签 # 默认标签类似数组的下标索引 >>> s = pd.Series(data=[1, 2, 3, np.nan, 5],index=['A','B','C', 'D', 'E']) >>> s A 1.0 B 2.0 C 3.0 D NaN E 5.0 dtype: float64
# 通过下标或者标签名字可以访问其中的元素 >>> s[0] 1.0 >>> s['A'] 1.0 pandas中的缺失值用NaN来表示,DataFrame对象示例如下 >>> df = pd.DataFrame(np.random.rand(5,5)) >>> df 0 1 2 3 4 0 0.163853 0.478228 0.096328 0.390939 0.528931 1 0.483235 0.964965 0.946697 0.617395 0.149224 2 0.720721 0.559443 0.346435 0.486527 0.390008 3 0.711582 0.519249 0.005936 0.866858 0.836957 4 0.897743 0.972732 0.537487 0.276900 0.948538 # index 参数指定行标签, 默认值为从0开始的下标 # columns参数指定列标签,默认值为从0开始的下标 >>> df = pd.DataFrame(np.random.rand(5,5),index=['A1','A2','A3','A4','A5'], columns=['A','B','C','D','E']) >>> df A B C D E A1 0.418639 0.536177 0.575832 0.836404 0.061494 A2 0.911322 0.062853 0.840488 0.051903 0.559243 A3 0.213690 0.797220 0.891103 0.232472 0.128613 A4 0.238780 0.397183 0.289779 0.370459 0.264069 A5 0.575950 0.311570 0.215405 0.793575 0.994698 # 通过列标签访问对应的列 # 输出内容就是一个Series对象 >>> df['A'] A1 0.418639 A2 0.911322 A3 0.213690 A4 0.238780 A5 0.575950 Name: A, dtype: float64
>>> df.A A1 0.418639 A2 0.911322 A3 0.213690 A4 0.238780 A5 0.575950 Name: A, dtype: float64
>>> df.get('A') A1 0.700150 A2 0.903883 A3 0.015775 A4 0.006292 A5 0.239663 Name: A, dtype: float64 DataFrame是pandas操作的核心, 支持异构数据,即不同的列对应不同的数据类型,示例如下 >>> df = pd.DataFrame({'A':[1, 2, 3, 4], 'B':['Andy', 'Rose', 'June', 'July']}) >>> df A B 0 1 Andy 1 2 Rose 2 3 June 3 4 July 这样的结构更具包容性,适合处理类似excel文件内容的数据。DataFrame的基本操作方法如下
1. 基本属性 DataFrame也具有numpy数组类似的维度,形状等属性,示例如下# 维度 >>> df.ndim 2 # 数值总数 >>> df.size 25 # 每个维度的尺寸 >>> df.shape (5, 5) # 每一列的数据类型 >>> df.dtypes A float64 B float64 C float64 D float64 E float64 dtype: object # 数据框中的所有值 >>> df.values array([[0.70015033, 0.12960382, 0.871099 , 0.86146233, 0.33794277], [0.90388331, 0.40102109, 0.3046794 , 0.40498749, 0.55128064], [0.01577541, 0.70574337, 0.99492806, 0.28706767, 0.62816839], [0.00629215, 0.488683 , 0.5385188 , 0.15954784, 0.15361006], [0.23966275, 0.54685001, 0.32405166, 0.81499923, 0.53875313]]) # 数据框的行和列标签 >>> df.axes [Index(['A1', 'A2', 'A3', 'A4', 'A5'], dtype='object'), Index(['A', 'B', 'C', 'D', 'E'], dtype='object')] # 行标签 >>> df.index Index(['A1', 'A2', 'A3', 'A4', 'A5'], dtype='object') # 行标签 >>> df.keys() Index(['A', 'B', 'C', 'D', 'E'], dtype='object') # 列标签 >>> df.columns Index(['A', 'B', 'C', 'D', 'E'], dtype='object') 2. 查看内容 实际中的数据框框往往包含非常多的行和列,通过head和tail方法可以简单查看头尾的几行,示例如下>>> df.head(n=1) A B C D E A1 0.418639 0.536177 0.575832 0.836404 0.061494
>>> df.head(n=2) A B C D E A1 0.418639 0.536177 0.575832 0.836404 0.061494 A2 0.911322 0.062853 0.840488 0.051903 0.559243
>>> df.tail(n=3) A B C D E A3 0.21369 0.797220 0.891103 0.232472 0.128613 A4 0.23878 0.397183 0.289779 0.370459 0.264069 A5 0.57595 0.311570 0.215405 0.793575 0.994698 3. 访问元素 基本的访问元素通过行列的索引或标签来进行,示例如下# 根据行和列的标签来访问对应元素 >>> df.at['A1', 'A'] 0.7001503320168031 # 根据行和列的索引来访问对应元素 >>> df.iat[0, 0] 0.7001503320168031 # 根据行和列的标签来访问对应元素 >>> df.loc['A1','A'] 0.7001503320168031 # 根据行和列的索引来访问对应元素 >>> df.iloc[0,0] 0.7001503320168031 4. 二元运算 对两个数据框进行运算,常用的加减乘除算数运算,示例如下>>> a = pd.DataFrame(np.random.rand(4,4)) >>> b = pd.DataFrame(np.random.rand(4,4)) # 加法 >>> a.add(b) 0 1 2 3 0 1.357769 1.684003 0.500581 0.814958 1 0.900818 1.138432 1.898524 1.000987 2 1.105629 1.076538 0.729917 0.682571 3 0.564739 1.017597 0.864299 0.801017 # 等价二元操作符 >>> a + b 0 1 2 3 0 1.357769 1.684003 0.500581 0.814958 1 0.900818 1.138432 1.898524 1.000987 2 1.105629 1.076538 0.729917 0.682571 3 0.564739 1.017597 0.864299 0.801017 # 减法 >>> a.sub(b) # 乘法 >>> a.mul(b) # 除法 >>> a.div(b) 逻辑运算,示例如下 # 大于 >>> a.gt(b) 0 1 2 3 0 True True False False 1 False False False False 2 True False True True 3 True False False True # 小于 >>> a.lt(b) # 小于等于 >>> a.le(b) # 大于等于 >>> a.ge(b) # 等于 >>> a.eq(b) # 不等于 >>> a.ne(b) 5. 合并数据框 # append 函数,将新的数据框追加为行 >>> a = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B']) >>> b = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B']) >>> a A B 0 0.529614 0.712904 1 0.969706 0.943299 >>> b A B 0 0.626073 0.293426 1 0.952565 0.251707 >>> a.append(b) A B 0 0.529614 0.712904 1 0.969706 0.943299 0 0.626073 0.293426 1 0.952565 0.251707
# assign 函数,为数据框新增列 >>> a.assign(C=pd.Series([1,2])) A B C 0 0.529614 0.712904 1 1 0.969706 0.943299 2 # 多列就是多个关键词参数 >>> a.assign(C=pd.Series([1,2]),D=[1,2]) A B C D 0 0.529614 0.712904 1 1 1 0.969706 0.943299 2 2 DataFrame相比numpy ndarray, 更加嵌合实际数据,用pandas来分析实际数据更加的便利,pandas中也提供了很多的统计分析函数以及灵活的操作方法,更多的技巧后续在详细介绍。
|