查看原文
其他

Pandas之数据查询与修改

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:杨长青

本文编辑:杨慧琳

技术总编:张学人

好消息!!!爬虫俱乐部将于2019年5月2日4日在武汉举行Stata编程技术五一训练营,此次采用理论与案例相结合的方式,旨在帮助大家熟悉Stata数据分析技巧,能够通过编程读取不同类型的数据源、实现复杂数据合并、清洗的程序化,并且熟悉Stata核心的爬虫技术。

详细培训大纲及报名方式,请点击文末阅读原文呦~


在数据处理的过程中,我们经常做的是不是查询某个位置的元素,或者针对某个位置元素进行赋值,或者删除某个变量或某行。以Stata中auto数据集为例,我们可采用的操作包括:list make price if price>15000 、replace price=1000 in 1、keep make price、drop price等。

那么,我们如何在python中对DataFrame数据类型进行操作呢?今天将介绍pandas中的几个常用函数:

at、iat :访问单个元素

loc、iloc :访问行或列数据

我们以auto数据集为例,首先按照在《Pandas之数据的读入与导出》中介绍的数据读入的方法,读入auto.dta:

import pandas as pdauto=pd.read_stata(r"E:\python程序\pandas\auto.dta") #读入dta文件auto.head() #列示前五行

数据的前五行如下:

1.单个元素的查询更改

对单个元素的访问,可以通过at、iat函数,二者的区别at是利用索引定位,而 iat通过整位置来定位(i代表integer)。比如查询第一行price的值,将行索引或行的整数位置放在第一位:

auto.at[1,"price"] #通过行列标签进行访问auto.iat[0,1] #通过整数位置进行访问

对于元素访问也可以通过类似于列表的方法,用[]来进行访问:

auto["price"][0]

但是这种访问的速度,远远小于at函数,我们使用%timeit查看两者运行时间:

上面查询方法也适合对元素的值进行更改:

auto.at[1,"price"]=5auto.iat[0,1]=6auto[0]=7

这样,我们便对auto数据集中的对应值进行了替换。

2.整组行或列数据的查询

上述函数只能对单个元素,进行查询,但想访问整组行或列数据该怎么办呢?这就用到了loc函数和iloc函数,和at、iat的区别一样,两者的区别也仅仅在于是使用整数位置还是标签。

比如想访问行索引为1、5的make和price的情况:

auto.loc[[1,5],['price','make']] #按索引auto.iloc[[1,5],[1,0]] #按整数位置

结果如下:

同时loc也可以也可以指定单数,代替at的所有功能,但是速度不如at函数。loc和iloc函数还能使用切片的方式来选择范围:

auto.loc[0:5,'make':'rep78'] #按照索引的名称auto.iloc[0:6,0:4]   #按位置 #按照整数位置

结果如下:

当然这里也可以使用[]方法:

auto[["make","price","rep78"]][0:6]

但是相对于loc方法来说,这种切片方法速度慢,而且也不支持对列索引使用“:”查询。这里查询的数据只是一个临时数据,如果想执行对原DataFrame数据的更改,只需执行:

auto=auto.loc[0:5,'make':'rep78']

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!

3.按条件查询

如要要按条件筛选数据该怎么办呢?想查询价格大于14000的车型,外国生产的数据该怎么处理呢?下面我们就来解决这个问题。

loc函数可以通过布尔列表或布尔系列来进行查询,我们可以生成一个布尔表达式price>=15000:

select=auto.price>=15000

之后再对auto进行筛选:

auto.loc[select]

如果想要得到价格大于10000的外国车,并只需要品牌、价格、是否国产三个信息只需:

select1=(auto.price>=10000)&(auto.foreign=="Foreign")auto.loc[select1,["make","price","foreign"]]

以上操作,也能通过[]方法来做,但是loc方法性能更优且更常用:

auto[(auto.price>=10000)&(auto.foreign=="Foreign")][["make","price","foreign"]]

但是如果我们想要挑选mpg等于18、19、20的观测要怎么处理呢?一个相对简单直接的方法是设定auto.”price”==18| auto.”price”==19| auto.”price”==20,但如果条件很多就看起来很繁琐。这里介绍一个函数DataFrame.isin(),括号内可以添加列表,用以判断DataFame中元素是否在列表中,也可以对series使用:

select3=auto.loc[:,"mpg"].isin([18,19,20])

这样select3就是一个布尔型序列,用以判断每行的mpg是否等于每行的值,然后我们就可以使用loc()函数将值提取出来:

auto.loc[select3,["make","mpg"]]

我们可以依据以上方法对查询结果进行保存或修改。到这里,我们便介绍了几种常用的集中数据查询和更改方法。这是我们运用pandas进行数据分析的基础。大家掌握了没有呢?如果在学习过程中遇到问题,欢迎通过邮件和我们取得联系。


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!


往期推文推荐


关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存