我们先要了解,pandas是基于Numpy构建的,pandas中很多的用法和numpy一致。pandas中又有series和DataFrame,Series是DataFrame的基础。
pandas的主要功能:
一、Series
1.创建方法
第一种:pd.Series([4,5,6,7])#执行结果04152637dtype:int64#将数组索引以及数组的值打印出来,索引在左,值在右,由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引,取值的时候可以通过索引取第二种:pd.Series([4,5,6,7,8],index=['a','b','c','d','e'])#index索引是用[]#执行结果a4b5c6d7e8dtype:int64#自定义索引,index是指定的索引名,是一个索引列表,里面包含的是字符串,依然可以通过默认索引取值。第三种:pd.Series({"a":1,"b":2})#传入字典格式数据#执行结果:a1b2dtype:int64#传入字典格式的数据,字典的key当成指定索引第四种:pd.Series(0,index=['a','b','c'])#执行结果:a0b0c0dtype:int64#创建一个值都是0的数组对于Series,其实我们可以认为它是一个长度固定且有序的字典,因为它的索引和数据是按位置进行匹配的,像我们会使用字典的上下文,就肯定也会使用Series,也支持通过索引取值。
2.缺失数据(******)在处理数据的时候经常会遇到这类情况
#第一步,创建一个字典,通过Series方式创建一个Series对象st={"sean":18,"yang":19,"bella":20,"cloud":21}obj=pd.Series(st)obj运行结果:sean18yang19bella20cloud21dtype:int64------------------------------------------#第二步a={'sean','yang','cloud','rocky'}#定义一个索引变量------------------------------------------#第三步obj1=pd.Series(st,index=a)obj1#将第二步定义的a变量作为索引传入#运行结果:rockyNaNcloud21.0sean18.0yang19.0dtype:float64#因为rocky没有出现在st的键中,所以返回的是缺失值dropna()#过滤掉值有NaN的行
obj1.dropna()#执行结果cloud21.0sean18.0yang19.0dtype:float64fillna()#填充缺失数据,这个填写1
obj1.fillna(1)#执行结果cloud21.0sean18.0yang19.0rocky1.0dtype:float64isnull()#缺失值返回True
obj1.isnull()#执行结果cloudFalseseanFalseyangFalserockyTruedtype:boolnotnull()#不是缺失值返回True
obj1.notnull()#执行结果cloudTrueseanTrueyangTruerockyFalsedtype:bool利用布尔值索引过滤缺失值
obj1[obj1.notnull()]#只有True的才显示#执行结果cloud21.0sean18.0yang19.0dtype:float643.Series特性
因为pandas是基于numpy的,所以有numpy的很多特性,Series和numpy很多类似
支持字典的特性:
4.整数索引
sr=pd.Series(np.arange(10))sr1=sr[3:]sr1运行结果:33445566778899dtype:int32#到这里会发现很正常,一点问题都没有,可是当使用整数索引取值的时候就会出现问题了。因为在pandas当中使用整数索引取值是优先以标签解释的(就是index的值),而不是下标。比如我想取索引值为1的数值,不再是我们之前的那种方法
sr1[1]#这种方式是取不出的,因为默认优先的是以标签解释的,这个没有1的标签(index)解决方法:
sr1.iloc[1]#以下标取值,(索引值为1的)#执行结果4sr1.loc[4]#以标签取值(index值为1)#执行结果45.Series数据对齐
sr1=pd.Series([12,23,34],index=['c','a','d'])sr2=pd.Series([11,20,10],index=['d','c','a',])sr1+sr2运行结果:a33c32d45dtype:int64#可以通过这种索引对齐直接将两个Series对象进行运算sr3=pd.Series([11,20,10,14],index=['d','c','a','b'])sr1+sr3运行结果:a33.0bNaNc32.0d45.0dtype:float64#sr1和sr3的索引不一致,所以最终的运行会发现b索引对应的值无法运算,就返回了NaN,一个缺失值将两个Series对象相加时将缺失值设为0
sr1=pd.Series([12,23,34],index=['c','a','d'])sr3=pd.Series([11,20,10,14],index=['d','c','a','b'])sr1.add(sr3,fill_value=0)运行结果:a33.0b14.0c32.0d45.0dtype:float64#将缺失值设为0,所以最后算出来b索引对应的结果为14二.DataFrame
DataFrame是一个表格型的数据结构,相当于是一个二维数组,含有一组有序的列。他可以被看做是由Series组成的字典,并且共用一个索引(这里的索引指的就是列索引)。
1.创建方式
创建一个DataFrame数组可以有多种方式,其中最为常用的方式就是利用包含等长度列表或Numpy数组的字典来形成DataFrame:
第一种:pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})#产生的DataFrame会自动为Series分配所索引,并且列会按照排序的顺序排列运行结果:onetwo014123232341#字典的key就是列索引,行索引和series一致>指定列可以通过columns参数指定顺序排列data=pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})pd.DataFrame(data,columns=['two','one'])#指定显示顺序#执行结果twoone041132223314#注意:columns一定要是key值中的,才能匹配的到,不然会报错第二种:pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3],index=['b','a','c'])})运行结果:onetwoa12b21c33#字典的key是列索引,index是行索引2.查看数据
常用属性和方法:(和numpy类似)
onetwoa12b21c33#这样一个数组df-----------------------------------------------------------------------------df.index#行索引运行结果:Index(['a','b','c'],dtype='object')----------------------------------------------------------------------------df.columns#列索引运行结果:Index(['one','two'],dtype='object')--------------------------------------------------------------------------df.T#转置运行结果:abcone123two213-------------------------------------------------------------------------df.values#获取值,ndarray类型运行结果:array([[1,2],[2,1],[3,3]],dtype=int64)------------------------------------------------------------------------df.describe()#统计信息运行结果:onetwocount3.03.0mean2.02.0std1.01.0min1.01.025%1.51.550%2.02.075%2.52.5max3.03.03.索引和切片
DataFrame使用索引切片:
4.常见获取数据的方式
打开csv,excel等文档获取数据
另存为
df.to_csv('./a.csv',index=False)#另存为,不要保存行索引(index索引),不然打开a.csv会出现两个行索引read_html获取页面上的表格
举例子:计算nba球队获取总冠军的次数
根据冠军球队来分组
统计次数,然后排序
python库:datatime
a.resample("3D").mean()#计算每三天的均值a.resample("3D").sum()#计算每三天的和...6.数据分组和聚合
在数据分析当中,我们有时需要将数据拆分,然后在每一个特定的组里进行运算,这些操作通常也是数据分析工作中的重要环节。
分组(GroupBY机制)
主要就是groupby结合索引和size的使用
聚合函数(组内应用某个函数)
apply(******)
GroupBy当中自由度最高的方法就是apply,它会将待处理的对象拆分为多个片段,然后各个片段分别调用传入的函数,最后将它们组合到一起。
df.apply(['func','axis=0','broadcast=None','raw=False','reduce=None','result_type=None','args=()','**kwds']func:传入一个自定义函数axis:函数传入参数当axis=0就会把一行数据作为Series的数据