pandas之query方法和sample随机抽样操作
query方法
在pandas中,支持把字符串形式的查询表达式传入query方法来查询数据,其表达式的执行结果必须返回布尔列表。在进行复杂索引时,由于这种检索方式无需像普通方法一样重复使用DataFrame的名字来引用列名,一般而言会使代码长度在不降低可读性的前提下有所减少。
例如
In[61]:df.query('((School=="FudanUniversity")&' ....:'(Grade=="Senior")&' ....:'(Weight>70))|' ....:'((School=="PekingUniversity")&' ....:'(Grade!="Senior")&' ....:'(Weight>80))') ....: Out[61]: SchoolGradeNameGenderWeightTransfer 38PekingUniversityFreshmanQiangHanMale87.0N 66FudanUniversitySeniorChengpengZhouMale81.0N 99PekingUniversityFreshmanChangpengZhaoMale83.0N 131FudanUniversitySeniorChengpengQianMale73.0Y
在query表达式中,帮用户注册了所有来自DataFrame的列名,所有属于该Series的方法都可以被调用,和正常的函数调用并没有区别,例如查询体重超过均值的学生:
In[62]:df.query('Weight>Weight.mean()').head() Out[62]: SchoolGradeNameGenderWeightTransfer 1PekingUniversityFreshmanChangqiangYouMale70.0N 2ShanghaiJiaoTongUniversitySeniorMeiSunMale89.0N 4FudanUniversitySophomoreGaojuanYouMale74.0N 10ShanghaiJiaoTongUniversityFreshmanXiaopengZhouMale74.0N 14TsinghuaUniversitySeniorXiaomeiZhouFemale57.0N
同时,在query中还注册了若干英语的字面用法,帮助提高可读性,例如:or,and,or,isin,notin。
例如,筛选出男生中不是大一大二的学生:
In[63]:df.query('(Gradenotin["Freshman","Sophomore"])and' ....:'(Gender=="Male")').head() ....: Out[63]: SchoolGradeNameGenderWeightTransfer 2ShanghaiJiaoTongUniversitySeniorMeiSunMale89.0N 16TsinghuaUniversityJuniorXiaoqiangQinMale68.0N 17TsinghuaUniversityJuniorPengWangMale65.0N 18TsinghuaUniversitySeniorXiaofengSunMale71.0N 21ShanghaiJiaoTongUniversitySeniorXiaopengShenMale62.0NaN
此外,在字符串中出现与列表的比较时,==和!=分别表示元素出现在列表和没有出现在列表,等价于isin和notin,例如查询所有大三和大四的学生:
In[64]:df.query('Grade==["Junior","Senior"]').head() Out[64]: SchoolGradeNameGenderWeightTransfer 2ShanghaiJiaoTongUniversitySeniorMeiSunMale89.0N 7TsinghuaUniversityJuniorGaoqiangQianFemale50.0N 9PekingUniversityJuniorJuanXuFemaleNaNN 11TsinghuaUniversityJuniorXiaoquanLvFemale43.0N 12ShanghaiJiaoTongUniversitySeniorPengYouFemale48.0NaN
对于query中的字符串,如果要引用外部变量,只需在变量名前加@符号。例如,取出体重位于70kg到80kg之间的学生:
In[65]:low,high=70,80 In[66]:df.query('Weight.between(@low,@high)').head() Out[66]: SchoolGradeNameGenderWeightTransfer 1PekingUniversityFreshmanChangqiangYouMale70.0N 4FudanUniversitySophomoreGaojuanYouMale74.0N 10ShanghaiJiaoTongUniversityFreshmanXiaopengZhouMale74.0N 18TsinghuaUniversitySeniorXiaofengSunMale71.0N 35PekingUniversityFreshmanGaoliZhaoMale78.0N
随机抽样
如果把DataFrame的每一行看作一个样本,或把每一列看作一个特征,再把整个DataFrame看作总体,想要对样本或特征进行随机抽样就可以用sample函数。有时在拿到大型数据集后,想要对统计特征进行计算来了解数据的大致分布,但是这很费时间。
同时,由于许多统计特征在等概率不放回的简单随机抽样条件下,是总体统计特征的无偏估计,比如样本均值和总体均值,那么就可以先从整张表中抽出一部分来做近似估计。
sample函数中的主要参数为n,axis,frac,replace,weights,前三个分别是指抽样数量、抽样的方向(0为行、1为列)和抽样比例(0.3则为从总体中抽出30%的样本)。
replace和weights分别是指是否放回和每个样本的抽样相对概率,当replace=True则表示有放回抽样。例如,对下面构造的df_sample以value值的相对大小为抽样概率进行有放回抽样,抽样数量为3。
In[67]:df_sample=pd.DataFrame({'id':list('abcde'), ....:'value':[1,2,3,4,90]}) ....: In[68]:df_sample Out[68]: idvalue 0a1 1b2 2c3 3d4 4e90 In[69]:df_sample.sample(3,replace=True,weights=df_sample.value) Out[69]: idvalue 4e90 4e90 4e90
补充:pandas.DataFrame.sample随机选取若干行
1、数据切片选取
1.1pandas.DataFrame.sample随机选取若干行
1.1.1功能说明
有时候我们只需要数据集中的一部分,并不需要全部的数据。这个时候我们就要对数据集进行随机的抽样。pandas中自带有抽样的方法。
功能相似:numpy.random.choice
Generatesarandomsamplefromagiven1-Dnumpyarray.
1.1.2使用说明
1.函数名及功能
DataFrame.sample(n=None,frac=None,replace=False,weights=None,random_state=None,axis=None)[source]
2.输入参数说明
df.sample(n=3,random_state=1)
提取3行数据列表
注意,使用random_state,以确保可重复性的例子。
抽取行的比例
例如frac=0.8,就是抽取其中80%。
是否为有放回抽样,
True:有放回抽样
False:未放回抽样
True:取行数据后,可以重复放回后再取
False:取行数据后不放回,下次取其它行数据
注意:当N>总数据容量,replace设置为值时有效
字符索引或概率数组
axis=0:为行字符索引或概率数组
axis=1:为列字符索引或概率数组
int:随机数发生器种子
或numpy.random.RandomState
random_state=None,取得数据不重复
random_state=1,可以取得重复数据
选择抽取数据的行还是列
axis=0:抽取行
axis=1:抽取列
3.返回值说明
返回选择的N行元素的DataFrame对象。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。