pandas入门
一、pandas的定义
基于numpy的数据结构,主要有一维数组Series和二维数组DataFrame两种结构
二、Series的基本概念
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import numpy as np 2 import pandas as pd 3 4 s = pd.Series(np.random.rand(5)) 5 print(s) 6 print(type(s)) 7 # 是一个带有标签的一维数组,可以保存任何的数据类型(整数,字符串,浮点数,Python对象),轴标签,成为索引 index 8 print(s.index) 9 print(s.values, type(s.values)) 10 # series相比Ndarry,就是自带了一个索引 一维数组 + 对应的索引 11 # series 更像一个有顺序的字典
三、Series的创建
3.1 由数组(一维数组)和列表创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 arr = np.random.randn(5) 2 s = pd.Series(arr) 3 print(s) 4 # index 默认使用整数 5 s = pd.Series(arr, index=list('abcde')) 6 pd.Series([1,2,3,4,5], index=list('abcde'), dtype=np.float64)
3.2 由字典创建,字典的key就是index,values就是values
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 dic = {'a':1, 'b': 2, 'c':'a'} 2 s = pd.Series(dic) 3 print(s)
3.3 由标量创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(10, index=list('abcde')) 2 s 3 # 如果由标量创建,必须提供index,来匹配长度
3.4 名称属性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(10, index=list('abcde'), name='ten') 2 s.name 3 s.rename #重命名
四、Series的索引和切片
4.1 位置下标,跟序列差不多
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5)) 2 print(s) 3 print(s[0], type(s[0])) 4 s[[1,4]]
4.2 标签索引,相当于字典
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5),index=list('abcde')) 2 print(s) 3 print(s['a'], type(s['a']), s['a'].dtype) 4 # 选择多个[[]] 返回的是新的Series对象 5 s[['a', 'd']]
4.3 切片
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s1 = pd.Series(np.random.rand(5)) 2 s2 = pd.Series(np.random.rand(5), index=list('abcde')) 3 print(s1[1:4]) 4 print(s2['a':'c']) 5 # 注意:用标签索引切片,闭区间 字符串索引, 6 # 切片的写法和list一致 7 s2[::2]
4.4 布尔型索引
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.arange(10)) 2 s[4] = None 3 bs1 = s>5 4 bs2 = s.isnull() 5 bs3 = s.notnull() 6 bs3 7 # 数组做判断之后,返回的是一个由布尔值组成的新的数组 8 s[bs3]
五、Series的常用操作
5.1 数据查看
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(50)) 2 s.head(10) #查看头部前10个数据 3 s.tail(10) #查看尾部后10个数据
5.2 数据重新索引
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5), index=list('abcde')) 2 s.reindex(['c', 'd', 'a', 'd', 'ab']) 3 # .reindex 根据索引重新排序,如果索引不存在 ,引入缺失值 4 # 返回新的序列 5 # fill_value 填充缺失值 6 print(s) 7 print('********') 8 print(s.reindex(['c', 'd', 'a','a', 'd', 'ab'], fill_value=0)) 9 print('********') 10 print(s)
5.3 数据对齐
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s1 = pd.Series(np.random.rand(3), index = ['Jack','Marry','Tom']) 2 s2 = pd.Series(np.random.rand(3), index = ['Wang','Jack','Marry']) 3 print(s1) 4 print(s2) 5 print(s1 + s2) 6 # 会根据index 自动对齐 7 # index顺序不影响 8 # NaN和任何值进行计算都是NaN
5.4 数据删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5), index=list('abcde')) 2 3 s.drop('c') 4 # drop 默认返回一个删除了指定数据的新的series 5 s.drop(['a','c']) 6 #s.drop('c', inplace=True) 7 #s 8 # inplace=True时,drop不会返回新的序列,会直接改变原数据 9 # inplace 默认等于False
5.5 数据添加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5), index=list('abcde')) 2 s2 = pd.Series(np.random.rand(5)) 3 s['f'] = 100 4 s2[5] = 100 5 s2 6 # .append方法,直接添加一个数组 7 s1=s.append(s2) 8 s1 9 # .append()返回一个新的series, 不改变原数据
5.6 数据修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = pd.Series(np.random.rand(5), index=list('abcde')) 2 print(s) 3 s['a'] = 100 4 print(s) 5 # 直接通过索引赋值,类似列表
六、DataFrame的基本概念和创建
6.1 基本概念
二维数组,是一个表个型的数据结构,包含了有序的列,其列的值可以是字符串,数值,布尔值等,带有标签的二维数组。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 data = {'name':['Jack','Tom','Mary'], 2 'age':[18,19,20], 3 'gender':['m','m','w']} 4 frame = pd.DataFrame(data) 5 print(frame) 6 # 二维数组,是一个表个型的数据结构,包含了有序的列,其列的值可以是字符串,数值,布尔值等 7 # 带有标签的二维数组 8 print(frame.index) #数据的索引 9 print(frame.columns) #数据的列标签 10 print(frame.values, type(frame.values)) #数据的值
6.2 DataFrame的创建
6.2.1 由数组/list组成的字典创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 data = {'name':['Jack','Tom','Mary'], 2 'age':[18,19,20], 3 'gender':['m','m','w']} 4 frame = pd.DataFrame(data,index=['Jack', 'Tom', 'Mary'], columns=['age', 'name', 'gender', 'height']) 5 # 一个键值对 ,是一列,所以值的长度要一致 6 print(frame) 7 # 指定columns参数重新排序,格式list,如果没有该列,用NaN填充 8 # 指定index 重新定义行索引,格式list,长度一致
6.2.2 由Series组成的字典创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 data1 = {'one':pd.Series(np.random.rand(2)), 2 'two':pd.Series(np.random.rand(3))} # 没有设置index的Series 3 data2 = {'one':pd.Series(np.random.rand(2), index = ['a','b']), 4 'two':pd.Series(np.random.rand(3),index = ['a','b','c'])} # 设置了index的Series 5 print(data1) 6 #print(data2) 7 df1 = pd.DataFrame(data1) 8 df2 = pd.DataFrame(data2) 9 print(df1) 10 print(df2) 11 # 由Seris组成的字典 创建Dataframe,columns为字典key,index为Series的标签(如果Series没有指定标签,则是默认数字标签) 12 # Series可以长度不一样,生成的Dataframe会出现NaN值
6.2.3 通过二维数组直接创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ar = np.random.rand(9).reshape(3,3) 2 print(ar) 3 df1 = pd.DataFrame(ar) 4 df2 = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['one','two','three']) # 可以尝试一下index或columns长度不等于已有数组的情况 5 print(df1) 6 print(df2) 7 # 通过二维数组直接创建Dataframe,得到一样形状的结果数据,如果不指定index和columns,两者均返回默认数字格式 8 # index和colunms指定长度与原数组保持一致
6.2.4 由字典组成的列表创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 data = [{'one': 1, 'two': 2}, {'one': 5, 'two': 10, 'three': 20}] 2 print(data) 3 df1 = pd.DataFrame(data) 4 df2 = pd.DataFrame(data, index = ['a','b']) 5 df3 = pd.DataFrame(data, columns = ['one','two']) 6 print(df1) 7 print(df2) 8 print(df3) 9 # 由字典组成的列表创建Dataframe,columns为字典的key,index不做指定则为默认数组标签 10 # colunms和index参数分别重新指定相应列及行标签
6.2.5 由字典组成的字典创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 data = {'Jack':{'math':90,'english':89,'art':78}, 2 'Marry':{'math':82,'english':95,'art':92}, 3 'Tom':{'math':78,'english':67}} 4 df1 = pd.DataFrame(data) 5 print(df1) 6 # 由字典组成的字典创建Dataframe,columns为字典的key,index为子字典的key 7 8 df2 = pd.DataFrame(data, columns = ['Jack','Tom','Bob']) 9 df3 = pd.DataFrame(data, index = ['a','b','c']) 10 print(df2) 11 print(df3) 12 # columns参数可以增加和减少现有列,如出现新的列,值为NaN 13 # index在这里和之前不同,并不能改变原有index,如果指向新的标签,值为NaN (非常重要!)