当前位置: 首页 > 后端技术 > Python

小白学Python数据分析(六):Pandas(五)基本操作(二)数据选择

时间:2023-03-26 17:28:25 Python

人生苦短,我用Python上一篇传送门:小白学Python数据分析(一):数据分析基础知识小白学Python数据分析(2):Pandas(1)概述小白学Python数据分析(3):Pandas(2)数据结构系列小白学Python数据分析(4):Pandas(3)数据结构DataFrame小白学Python数据分析(5):Pandas(4)基本操作(1)查看数据简介在上一篇文章中,我们介绍了如何在Pandas中进行一些基本的数据查看操作,但是官方推荐我们使用.at、.iat、.loc和.iloc,几种Pandas优化的数据访问方法来访问数据。首先,让我们创建一个DataFrame来进行演示。偷懒了,然后把上篇文章的DataFrame复制过来,如下:importnumpyasnpimportpandasaspddates=pd.date_range('20200101',periods=6)df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))print(df)DataFrame是由很多列组成的,其实可以看做是由多个Series组成的,我们可以直接获取单个列来获取aSeries,如下:#获取单列,获取Seriesprint(df['A'])#输出结果2020-01-01-0.0654772020-01-02-1.0897162020-01-030.0492152020-01-04-0.0176152020-01-05-0.9104022020-01-06-0.008887Freq:D,Name:A,dtype:float64接下来我们可以使用[]对DataFrame进行切片,示例如下:#linesliceprint(df[0:3])print(df['20200101':'20200103'])#输出结果ABCD2020-01-01-0.0654771.6038271.1529690.7428422020-01-02-1.089716-0.5409360.4569170.2952722020-01-030.049215-1.182454-0.294177-0.698877ABCD2020-01-01-0.0654771.6038271.1529690.7428422020-01-02-1.089716-0.5409360.4569170.2952722020-01-4921.51.182454-0.294177-0.698877可以看出我们通过整数或者列loc对DataFrame进行了切片。我们可以使用loc来定位列名和索引名。比如我们通过column提取一行数据,如下:#提取一行有标签的数据print(df.loc[dates[0]])#输出结果A-0.065477B1.603827C1.152969D0.742842Name:2020-01-0100:00:00,dtype:float64注意这里的日期是我们前面生成的数组,这里的写法也可以换成df.loc['20200101']。同理,我们可以通过切片获取某一行的数据,如下:#提取多列带标签的数据print(df.loc[:,['A','B']])#输出结果AB2020-01-01-0.0654771.6038272020-01-02-1.089716-0.5409362020-01-030.049215-1.1824542020-01-04-0.017615-0.7776372020-01-05-0.910402-0.1739592020-01-06-0.0088870.525035#用标签进行切片操作,同时使行和列的终点print(df.loc['20200101':'20200103',['A','B']])#输出结果AB2020-01-01-0.0654771.6038272020-01-02-1.089716-0.5409362020-01-030.049215-1.182454#一行返回两列print(df.loc['20200101',['A','B']])#输出结果A-0.065477B1.603827Name:2020-01-0100:00:00,dtype:float64那我想获取指定位置的数据怎么办呢?当我们把DataFrame看成一个坐标系时,当然指定横纵坐标就可以确定一个唯一的点,如下:#获取一个标量值print(df.loc[dates[0],'A'])#输出结果-0.06547653622759132ilociloc和上面的loc很像,loc主要是通过行进行索引定位,iloc是通过索引进行索引定位,也就是列,所以参数是一个整数,iloc的英文全称是索引定位。先看一个简单的例子,我们用整数来选择其中一列:#使用整数位置来选择print(df.iloc[3])#输出结果A-0.017615B-0.777637C0.824364D0.210244Name:2020-01-0400:00:00,dtype:float64这里我们还可以添加切片进行选择:#使用整数按行和列进行切片操作print(df.iloc[3:5,0:2])#输出结果AB2020-01-04-0.017615-0.7776372020-01-05-0.910402-0.173959#使用整数列表按位置切片print(df.iloc[[1,2,4],[0,2]])#输出结果AC2020-01-02-1.0897160.4569172020-01-030.049215-0.2941772020-01-05-0.910402-1.140222#整行切片打印(df.iloc[1:3,:])#输出结果ABCD2020-01-02-1.08970.5409360.4569170.2952722020-01-030.049215-1.182454-0.294177-0.698877#02-0.5409360.4569172020-01-03-1.182454-0.2941772020-01-04-0.7776370.8243642020-01-05-0.173959-1.1402222020-01-060.525035-1.076101同样,我们也可以直接通过iloc选择一个标量值:#同上得到一个标量值print(df.iloc[1,1])#结果如下——0.540936460611594at和iatat和iat是用来访问单个元素的,他们的访问速度比上面的loc和iloc快。at的使用方法与loc类似。示例如下:print(df.at[dates[0],'A'])#outputresult-0.06547653622759132iat到iloc就像at到loc,示例如下:print(df.iat[1,1])#outputresult-0.540936460611594其他的我们可以使用一些判断条件来选择数据,比如选择单列值的数据,例子如下:print(df[df.A>0])#OutputresultABCD2020-01-030.049215-1.182454-0.294177-0.698877上面的例子是输出A列所有大于0的数据,也有直接用整个df来判断的。示例如下:print(df[df<0])#输出结果ABCD2020-01-01-0.065477NaNNaNNaN2020-01-02-1.089716-0.540936NaNNaN2020-01-03NaN-1.182454-0.294177-0.6988772020-01-04-0.017615-0.777637NANNANNANNAN2020-01-01-01.910402-0.173959-1.140222-0.6626152020202020202020-2020-01-06-01-06-0.008887NAN-1..076101-076101-0.66110.66224.86224.86224.86224.86224.86224;和Gitee,方便访问。示例代码-Github示例代码-Gitee参考https://www.pypandas.cn/docs/...如果我的文章对你有帮助,请扫码关注作者的公众号:获取最新干货推送:)