当前位置: 首页 > 科技观察

介绍一些Pandas实战中的高端玩法

时间:2023-03-21 13:26:39 科技观察

什么是多/分层索引多/分层索引(MultiIndex)可以理解为一种堆叠式索引结构,它的存在为一些相当复杂的数据分析和操作打开了大门,尤其是在处理高纬度数据时,非常方便。让我们首先创建一个具有多个索引的DataFrame数据集。多索引的创建首先在“列”方向创建多索引,即我们在调用columns参数时传入两个或多个数组,代码如下:df1=pd.DataFrame(np.random.randint(0,100,size=(2,4)),index=['ladies','gentlemen'],columns=[['English','English','French','French'],['like','dislike','like','dislike']])输出同理,如果我们想在“行”方向有多个索引,我们可以在调用index参数时传入两个或多个数组。代码如下:df=pd.DataFrame(np.random.randint(0,100,size=(4,2)),index=[['英文','','中文',''],['like','dislike','like','dislike']],columns=['ladies','gentlemen'])输出除此之外,还有其他几种常见的创建多个索引的方式,即:pd.MultiIndex。from_arrayspd.MultiIndex.from_framepd.MultiIndex.from_tuplespd.MultiIndex.from_product我这里就挑一个给大家看如何创建多索引。代码如下:df2=pd.DataFrame(np.random.randint(0,100,size=(4,2)),columns=['ladies','gentlemen'],index=pd.MultiIndex.from_product([['英语','法语'],['like','dislike']]))输出获取多个索引的值接下来我们看一下如何获取多索引数据集中的数据。使用的数据集是英国三大城市,伦敦,剑桥和牛津2019年气候数据如下:importpandasaspdffrompandasimportIndexSliceasidxdf=pd.read_csv('dataset.csv',index_col=[0,1],header=[0,1])df=df.sort_index()dfoutput在“行”索引上,我们可以看到“城市”和“日期”两个维度,而在“列”上"索引,我们可以看到是"不同时间段"和一些"温度"等指标,先从"列"方向看多个索引的级别,代码如下:df.columns.levelsoutputFrozenList([['Day','Night'],['MaxTemperature','Weather','Wind']])我们要获取一级以上的指标值,代码如下:df.columns.get_level_values(0)outputIndex(['Day','Day','Day','Night','Night','Night'],dtype='object')同理,对于第二层的索引值,把0换成1就行了,代码如下:df.columns.get_level_values(1)outputIndex(['Weather','Wind','MaxTemperature','Weather','Wind','MaxTemperature'],dtype='object')然后获取“行”方向的多个索引值同理,这里不再赘述。数据获取涉及数据的获取,方法有很多种,最常用的是loc()方法和iloc()方法,例如:df.loc['London','Day']##或者df.loc().loc[('London',),('Day',)]output通过调用loc()方法获取第一层的数据。如果我们要获取所有“行”的数据,代码如下:df.loc[:,'Day']##或者df.loc[:,('Day',)]output或者所有“列”,代码如下:df.loc['London',:]##或者是df.loc[('London',),:]output当然我们也可以这样做,指定行方向二级索引,代码如下:df.loc['London','2019-07-02']##或df.loc[('London','2019-07-02')]输出多指标数据获取假设我们要获取剑桥2019年7月3日白天的数据,代码如下:df.loc['Cambridge','Day'].loc['2019-07-03']output在第一次调用loc['Cambridge','Day']时返回一个DataFrame数据集,然后通过调用loc()方法提取数据。当然,还有更快的方法。代码如下:df.loc[('Cambridge','2019-07-01'),'Day']我们需要传入祖先表单的索引值来提取数据。如果我们不只是想获取单行或单列数据,我们可以这样做:df.loc[('Cambridge',['2019-07-01','2019-07-02']),'Day']输出或获取多列数据,代码如下:df.loc['Cambridge',('Day',['Weather','Wind'])]output如果我们要获取剑桥2019年7月1日1日到3日连续3天的白天气候数据,代码如下:df.loc[('Cambridge','2019-07-01':'2019-07-03'),'Day']输出这样写会报语法错误。正确的做法应该是:df.loc[('Cambridge','2019-07-01'):('London','2019-07-03'),'Day']调用xs()方法小编也推荐使用xs()方法在多重索引中指定层级。比如我们只想要2019年7月1日主要城市的数据,代码如下:df.xs('2019-07-01',level='Date')输出也可以接受多维索引。比如想获取伦敦2019年7月4日全天的数据,代码如下:df.xs(('London','2019-07-04'),level=['City','Date'])output还有一个axis参数,指定是按“列”方向还是“行”方向获取数据。比如我们要获取“Weather”列中的数据,代码如下:df.xs('Weather',level=1,axis=1)输出中的level参数代表级别,我们替换它与0,并查看结果。df.xs('Day',level=0,axis=1)输出的是2019年三大城市的白天气候数据。IndexSlice()方法被调用。同时,Pandas还提供了IndexSlice()方法,方便我们更加快速的提取多索引数据集中的数据。代码如下:frompandasimportIndexSliceasidxdf.loc[idx[:,'2019-07-04'],'Day']output我们也可以指定行列方向的索引来提取数据,代码如下:rows=idx[:,'2019-07-02']cols=idx['Day',['MaxTemperature','Weather']]df.loc[rows,cols]output