数据结构论坛

首页 » 分类 » 常识 » Pandas的介绍与基本使用
TUhjnbcbe - 2025/6/10 18:11:00

1、什么是Pandas

当大家谈论到数据分析时,提及最多的语言就是Python和SQL,而Python之所以适合做数据分析,就是因为他有很多强大的第三方库来协助,pandas就是其中之一,它是基于Numpy构建的,正因pandas的出现,让Python语言也成为使用最广泛而且强大的数据分析环境之一。如果说没有pandas的出现,目前的金融数据分析领域还应该是R语言的天下。

2、Pandas能干什么

Pandas的主要功能:

具备对应其功能的数据结构DataFrame,Series集成时间序列功能提供丰富的数学运算和操作灵活处理缺失数据.....以上就是pandas能完成的一些基础操作,当然并不完全,下面就来看看pandas到底是怎么用的。

3、怎么用Pandas

安装方法:

pipinstallpandas

引用方法:

importpandasaspd

3.1、Series

Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。在数据分析的过程中非常常用。

3.1.1、创建方法

第一种:pd.Series([4,5,6,7,8])执行结果:dtype:int64#将数组索引以及数组的值打印出来,索引在左,值在右,由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引,取值的时候可以通过索引取值,跟之前学过的数组和列表一样-----------------------------------------------第二种:pd.Series([4,5,6,7,8],index=[a,b,c,d,e])执行结果:a4b5c6d7e8dtype:int64#自定义索引,index是一个索引列表,里面包含的是字符串,依然可以通过默认索引取值。-----------------------------------------------第三种:pd.Series({a:1,b:2})执行结果:a1b2dtype:int64#指定索引-----------------------------------------------第四种:pd.Series(0,index=[a,b,c])执行结果:a0b0c0dtype:int64#创建一个值都是0的数组-----------------------------------------------对于Series,其实我们可以认为它是一个长度固定且有序的字典,因为它的索引和数据是按位置进行匹配的,像我们会使用字典的上下文,就肯定也会使用Series

3.1.2、缺失数据

dropna()#过滤掉值为NaN的行fillna()#填充缺失数据isnull()#返回布尔数组,缺失值对应为Truenotnull()#返回布尔数组,缺失值对应为False#第一步,创建一个字典,通过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的键中,所以返回的是缺失值通过上面的代码演示,对于缺失值已经有了一个简单的了解,接下来就来看看如何判断缺失值

1、obj1.isnull()#是缺失值返回Ture运行结果:rockyTruecloudFalseseanFalseyangFalsedtype:bool2、obj1.notnull()#不是缺失值返回Ture运行结果:rockyFalsecloudTrueseanTrueyangTruedtype:bool3、过滤缺失值#布尔型索引obj1[obj1.notnull()]运行结果:cloud21.0yang19.0sean18.0dtype:float.1.3、Series特性

importnumpyasnpimportpandasaspd从ndarray创建Series:Series(arr)arr=np.arange(10)sr=pd.Series(arr)#ndarray创建Series与标量(数字)进行运算:sr*2srx=sr*2#与标量(数字)进行运算两个Series运算sr*srx#两个Series运算布尔值过滤:sr[sr0]sr[sr3]#布尔值过滤统计函数:mean()、sum()、cumsum()#统计函数sr.mean()sr.sum()sr.cumsum()3.1.4、支持字典的特性

从字典创建Series:Series(dic),dic={A:1,B:2,C:3,D:4,E:5}#字典创建Seriesdic_arr=pd.Series(dic)In运算:ainsr、forxinsrAindic_arr------------------------------foriindic_arr:print(i)键索引:sr[a],sr[[a,b,d]]dic_arr[[A,B]]#键索引键切片:sr[a:c]dic_arr[A:C]#键切片其他函数:get(a,default=0)等dic_arr.get(A,default=0)3.1.5、整数索引

pandas当中的整数索引对象可能会让初次接触它的人很懵逼,接下来通过代码演示:

sr=pd.Series(np.arange(10))sr1=sr[3:].copy()sr1运行结果:99dtype:int32#到这里会发现很正常,一点问题都没有,可是当使用整数索引取值的时候就会出现问题了。因为在pandas当中使用整数索引取值是优先以标签解释的,而不是下标sr1[1]解决方法:

loc属性#以标签解释iloc属性#以下标解释sr1.iloc[1]#以下标解释sr1.loc[3]#以标签解释3.1.6、Series数据对齐

pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

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灵活的算术方法:add,sub,div,mul

到这里可能就会说了pandas就这么简单吗,那我们接下来一起看看这个二维数组DataFraeme

3.2、DataFrame

DataFrame是一个表格型的数据结构,相当于是一个二维数组,含有一组有序的列。他可以被看做是由Series组成的字典,并且共用一个索引。接下来就一起来见识见识DataFrame数组的厉害吧!!!

3.2.1、创建方式

创建一个DataFrame数组可以有多种方式,其中最为常用的方式就是利用包含等长度列表或Numpy数组的字典来形成DataFrame:

第一种:pd.DataFrame({one:[1,2,3,4],two:[4,3,2,1]})#产生的DataFrame会自动为Series分配所索引,并且列会按照排序的顺序排列运行结果:onetwo指定列可以通过columns参数指定顺序排列data=pd.DataFrame({one:[1,2,3,4],two:[4,3,2,1]})pd.DataFrame(data,columns=[one,two])#打印结果会按照columns参数指定顺序第二种:pd.DataFrame({one:pd.Series([1,2,3],index=[a,b,c]),two:pd.Series([1,2,3],index=[b,a,c])})运行结果:onetwoa12b21c33以上创建方法简单了解就可以,因为在实际应用当中更多是读数据,不需要自己手动创建

3.2.2、查看数据

常用属性和方法:

index获取行索引columns获取列索引T转置values获取值索引describe获取快速统计onetwoa12b21c33#这样一个数组df---------------------------------------------------------------------------df.indexIndex([a,b,c],dtype=object)---------------------------------------------------------------------------df.columnsIndex([one,two],dtype=object)--------------------------------------------------------------------------df.Tabconetwo-------------------------------------------------------------------------df.valuesarray([[1,2],[2,1],[3,3]],dtype=int64)------------------------------------------------------------------------df.describe()onetwocount3.03.0#数据统计mean2.02.0#平均值std1.01.0#标准差min1.01.0#最小值25%1.51.5#四分之一均值50%2.02.0#二分之一均值75%2.52.5#四分之三均值max3.03.0#最大值3.2.3、索引和切片

DataFrame有行索引和列索引。DataFrame同样可以通过标签和位置两种方法进行索引和切片。DataFrame使用索引切片:

方法1:两个中括号,无论是先取行还是先取列都可以。importtushareastsdata=ts.get_k_data()data[open][:10]#先取列再取行data[:10][open]#先取行再取列方法2(推荐):使用loc/iloc属性,一个中括号,逗号隔开,先取行再取列。loc属性:解释为标签iloc属性:解释为下标data.loc[:10,open:low]#用标签取值data.iloc[:10,1:5]#用下标取值向DataFrame对象中写入值时只使用方法2行/列索引部分可以是常规索引、切片、布尔值索引、花式索引任意搭配。(注意:两部分都是花式索引时结果可能与预料的不同)3.3、时间对象处理

处理时间对象可能是我们在进行数据分析的过程当中最常见的,我们会遇到各种格式的时间序列,也需要处理各种格式的时间序列,但是一定不能对这些数据懵逼,我们需要找到最合适的招式来处理这些时间。接下来就一起来看吧!!!

3.3.1、时间序列类型

时间戳:特定时刻固定时期:如年1月时间间隔:起始时间-结束时间3.3.2、Python库:datatime

date、datetime、timedeltaimportdatetime#datetime.date()#date对象today=datetime.date.today()#获取当天日期,返回date对象t1=datetime.date(,4,18)#设置时间格式为datetime.date#datetime.datetime()#datetime对象now=datetime.datetime.now()#获取当天日期,返回datetime对象t2=datetime.datetime(,4,18)#设置时间格式为datetime.datetime#datetime.timedelta()#时间差today=datetime.datetime.today()yestoday=today-datetime.timedelta(1)#以时间做运算print(today,yestoday)dt.strftime()#将时间格式转换为字符串today.strftime(%Y-%m-%d)yestoday.strftime(%Y-%m-%d)strptime()#将日期字符串转成datetime时间格式,第二个参数由时间格式决定datetime.datetime.strptime(-04-18,%Y-%m-%d)3.3.3、灵活处理时间对象:dateutil包

dateutil.parser.parse()importdateutil#将字符串格式的日期转换为datetime对象date=Jan2ndt3=dateutil.parser.parse(date)3.3.4、成组处理时间对象:pandas

pd.to_datetime([-01-01,-02-02])将字符串转换为为时间对象

fromdatetimeimportdatetimeimportpandasaspddate1=datetime(,4,18,12,24,30)date2=-04-18t4=pd.to_datetime(date1)t5=pd.to_datetime(date2)t6=pd.to_datetime([date1,date2])t4,t5,t6#转换单个时间数据是返回Timestamp对象,转换多个时间数据返回DatetimeIndex对象(Timestamp(-04-:24:30),Timestamp(-04-:00:00),DatetimeIndex([-04-:24:30,-04-:00:00],dtype=datetime64[ns],freq=None))将索引设置为时间序列

ind=pd.to_datetime([-03-01,Feb3,08/12-/])sr=pd.Series([1,2,3],index=ind)#补充:pd.to_datetime([-03-01,Feb3,08/12-/]).to_pydatetime()array([datetime.datetime(,3,1,0,0),datetime.datetime(,2,3,0,0),datetime.datetime(,8,12,0,0)],dtype=object)#通过to_pydatetime()方法将其转换为ndarray数组3.3.5、产生时间对象数组:data_range

start开始时间end结束时间periods时间长度freq时间频率,默认为D,可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es),S(econd),A(year),…pd.date_range(-1-1,-2-2,freq=D)DatetimeIndex([-01-01,-01-02,-01-03,-01-04,-01-05,-01-06,-01-07,-01-08,-01-09,-01-10,-01-11,-01-12,-01-13,-01-14,-01-15,-01-16,-01-17,-01-18,-01-19,-01-20,-01-21,-01-22,-01-23,-01-24,-01-25,-01-26,-01-27,-01-28,-01-29,-01-30,-01-31,-02-01,-02-02],dtype=datetime64[ns],freq=D)3.3.6、时间序列

时间序列就是以时间对象为索引的Series或DataFrame。datetime对象作为索引时是存储在DatetimeIndex对象中的。

#转换时间索引dt=pd.date_range(-01-01,-02-02)#生成一个带有时间数据的DataFrame数组a=pd.DataFrame({num:pd.Series(random.randint(-,)for_inrange(30)),date:dt})#通过index修改索引a.index=pd.to_datetime(a[date])特殊功能:

传入“年”或“年月”作为切片方式传入日期范围作为切片方式丰富的函数支持:resample(),strftime(),……a.resample(3D).mean()#计算每三天的均值a.resample(3D).sum()#计算每三天的和...时间序列的处理在数据分析当中非常重要,但是有时候时间的格式不一致又会让人非常烦躁,只要把以上秘籍都学会就可以把时间序列制得服服帖帖。

3.4、数据分组和聚合

在数据分析当中,我们有时需要将数据拆分,然后在每一个特定的组里进行运算,这些操作通常也是数据分析工作中的重要环节。分组聚合相对来说也是一个稍微难理解的点,需要各位有一定的功力来学习.

3.4.1、分组(GroupBY机制)

pandas对象(无论Series、DataFrame还是其他的什么)当中的数据会根据提供的一个或者多个键被拆分为多组,拆分操作实在对象的特定轴上执行的。就比如DataFrame可以在他的行上或者列上进行分组,然后将一个函数应用到各个分组上并产生一个新的值。最后将所有的执行结果合并到最终的结果对象中。

分组键可以是多种样式,并且键不一定是完全相同的类型:

列表或者数组,长度要与待分组的轴一样表示DataFrame某个列名的值。字典或Series,给出待分组轴上的值与分组名之间的对应关系函数,用于处理轴索引或者索引中的各个标签后三种只是快捷方式,最终仍然是为了产生一组用于拆分对象的值。

首先,通过一个很简单的DataFrame数组尝试一下:

df=pd.DataFrame({key1:[x,x,y,y,x,key2:[one,two,one,,two,one],data1:np.random.randn(5),data2:np.random.randn(5)})dfkey1key2data1data20xone0..xtwo-0..yone1..ytwo1..xone-0.-1.访问data1,并根据key1调用groupby:

f1=df[data1].groupby(df[key1])f1上述运行是没有进行任何计算的,但是我们想要的中间数据已经拿到了,接下来,就可以调用groupby进行任何计算

f1.mean()#调用mean函数求出平均值key1x0.y2.Name:data1,dtype:float64以上数据经过分组键(一个Series数组)进行了聚合,产生了一个新的Series,索引就是key1列中的唯一值。这些索引的名称就为key1。接下来就尝试一次将多个数组的列表传进来

f2=df[data1].groupby([df[key1],df[key2]])f2.mean()key1key2xone0.two0.yone-0.two-0.Name:data1,dtype:float64传入多个数据之后会发现,得到的数据具有一个层次化的索引,key1对应的x\y;key2对应的one\two.

f2.mean().unstack()#通过unstack方法就可以让索引不堆叠在一起了key2onetwokey1x0.0.y-0.-0.补充:

1、分组键可以是任意长度的数组2、分组时,对于不是数组数据的列会从结果中排除,例如key1、key2这样的列3、GroupBy的size方法,返回一个含有分组大小的Series#以上面的f2测试f2.size()key1key2xone2two1yone1two1Name:data1,dtype:int64到这跟着我上面的步骤一步一步的分析,会发现还是很简单的,但是一定不能干看,还要自己下手练,只有多练才能融汇贯通!!!

3.4.2、聚合(组内应用某个函数)

聚合是指任何能够从数组产生标量值的数据转换过程。刚才上面的操作会发现使用GroupBy并不会直接得到一个显性的结果,而是一个中间数据,可以通过执行类似mean、count、min等计算得出结果,常见的还有一些:

自定义聚合函数

不仅可以使用这些常用的聚合运算,还可以自己自定义。

#使用自定义的聚合函数,需要将其传入aggregate或者agg方法当中defpeak_to_peak(arr):returnarr.max()-arr.min()f1.aggregate(peak_to_peak)运行结果:key1x3.y1.Name:data1,dtype:float64多函数聚合:

f1.agg([mean,std])运行结果:meanstdkey1x-0..y-0..最终得到的列就会以相应的函数命名生成一个DataFrame数组

以上我们是可以通过agg或者是aggregate来实现多函数聚合以及自定义聚合函数,但是一定要注意agg方法只能进行聚合操作,进行其他例如:排序,这些方法是会报错的。agg返回的是数据的标量,所以有些时候并不适合使用agg,这就要看我们接下来的操作了。

3.4.3、apply

GroupBy当中自由度最高的方法就是apply,它会将待处理的对象拆分为多个片段,然后各个片段分别调用传入的函数,最后将它们组合到一起。

df.apply([func,axis=0,broadcast=None,raw=False,reduce=None,result_type=None,args=(),**kwds]

func:传入一个自定义函数axis:函数传入参数当axis=1就会把一行数据作为Series的数据

#分析欧洲杯和欧洲冠军联赛决赛名单importpandasaspdurl=

1
查看完整版本: Pandas的介绍与基本使用