编程语言
首页 > 编程语言> > 【Python】where cut query melt函数用法

【Python】where cut query melt函数用法

作者:互联网

一,where函数用法

where可以通过Pandas包调用也可以通过numpy来调用。但是日常我们使用numpy调用where的场景会更多。

一起来看一下两者的使用及区别吧。

1. 使用Pandas中的where

数据源

 1 #%%
 2 
 3 import pandas as pd
 4 import numpy as np
 5 df = pd.DataFrame(
 6     {
 7         "商品":["mate book Pro2020 X","mate P40","mate Pro 40"],
 8         "活动价":[9899,0,6899],
 9         "原价":[10480,4188,7388]
10     }
11 )
12 df

结果

Pandas 使用where案例呈现

#%%

#可以通过where对固定列中的元素进行判断.如下案例中,符合条件则按照活动价标准赋值.不符合条件按照原价列赋值
df["实收价"] = df["活动价"].where(
    df["活动价"]>5000, #如果大于指定条件就显示活动价
    df["原价"] #如果条件不成立就显示原价
)
df

结果

说明:上述是以活动价为判断条件,条件符合则按照条件执行,不符合则按照条件下方的原价执行。

2. 使用numpy中的where

#使用numpy中的where同样可以实现上述效果.日常numpy中的where更常用
df["实收价"] = np.where(
    df["原价"]>5000,  #如果原价大于5000就显示下面的活动价否则就显示最下方的原价
    df["活动价"],
    df["原价"]
)
df

#%%

df["实收价"] = np.where(
    df["活动价"]==0,
    df["原价"],
    df["活动价"]
)

df

结果:

3. numpy中where的另一种使用场景

#numpy中的where条件判断,支持字符串显示,也支持list列表更Series显示.
df["热销度"] = np.where(
    df["原价"]>5000,
    "畅销",
    "平销"
)
df

结果:

 二,Cut函数用法

Cut函数的使用,主要是将值做分类到间隔。简单来讲就是对指定的值划分层级,每个值隶属于那个层级就会划分到那里去。

一起来看一下以下的案例就清楚了。

数据源

1 import pandas as pd
2 
3 #读取文件(读取前10行数据),自动转换文件格式
4 df = pd.read_excel("./datas/all_class_info.xlsx").convert_dtypes()
5 df.head(10)

结果:

1. Cut函数等级划分(指定分数区间精确划分)

#%%
#按照总分划分等级(精确划分)
df["等级"] = pd.cut(
    df["总分"], # 把总分作为判断要素
    bins=[0,160,210,300], #bins设置分段.0-160之间代表三门成绩不及格,以此类推
    include_lowest=True, #如果为True,如果分数为0也会被包含到不及格.不然显示为None
    labels=["不及格","及格","优秀"] #对应上述bins设置等级
)

df

结果:

说明:

上述案例主要是通过bins参数指定数值范围,例如0-160对应的是labels中的不及格.160-210对应的是及格,最后210-300对应的是优秀。include_lowest如果为True代表0也会包含到0-160这个区间范围内。如果为False的话则不被包含在内。

2. Cut函数等级划分(模糊划分)

#按照总分划分等级(模糊划分)
df["等级"] = pd.cut(
    df["总分"], # 把总分作为判断要素
    bins= 3,  #也可以直接给一个int类型.会根据最小到最大值/3来自动分为3个段.这样做算的是均值没有bins指定来的精确
    labels=["不及格","及格","优秀"] #对应上述bins设置等级
)
df

结果:

说明:

主要是通过bins这个参数来指定要划分多少个区间。3为总分的平均值。是按照总分的最小值到最大值的1/3来划分的。这样做就没有上述指定每段区间值的范围来的更加精确。

例如:朱瑞麒的成绩加起来平均值明显每门成绩低于60但是依然定义为及格。是因为总分的最大值到最小值进行了1/3平均所导致的。因此如果要精确划分的话建议使用案例1的做法。

如果只是算平均划分的话可以使用案例2。

三,Query函数用法

Query也是对数据进行筛选。之前的章节中提到过掩码的用法。可以通过返回True,False的方式对指定行列进行条件判断,符合条件的则被过滤筛选出来。

Query也可以实现相同的效果。一起来看一下下列的案例演示。

数据源

#%%

import pandas as pd

df = pd.read_excel("./datas/all_class_info.xlsx").convert_dtypes()
df

结果:

1. 通过掩码的方式,筛选出数学,语文,英语都及格的男生学生信息。

#需求1
#通过掩码提取数学,英语,语文都大于60分的男同学信息
df[(df["数学"]>60)&(df["语文"]>60)&(df["英语"]>60)&(df["性别"]=="男")]

结果:

2. 通过Query函数,筛选出数学,语文,英语都及格的男生学生信息。

注意:这里使用了变量赋值的方法。在调用变量时,Query要求在变量前加@符号不然无法识别变量

#%%

#需求2
#通过query提取变量的方式,找出数学,语文,英语都大于60的男同学
x=60   #定义变量
y="男"

#通过query提取变量做条件判断,提取数据。但是提取变量前必须加@符号。缺点:代码可读性差。优点:结构清晰联动方便
df.query("数学>@x").query("语文>@x").query("英语>@x").query("性别==@y")
#df.query("语文>60").query("数学>60").query("英语>60")

结果:

当然也可以变量和条件联合使用例如:

#%%

#上述的例子也可以直接通过传入数字和变量的方式联合使用。注意不能直接==字符串.必须先声明才能做判断
y="女" #定义变量
df.query("语文>60").query("数学>60").query("英语>60").query("性别==@y")

结果:

还可以对两列进行直接的对比运算例如

#需求3
#筛选出语文大于英语,同时语文也大于数学成绩的所有行
df.query("语文>英语").query("语文>数学")

结果:

还可以对指定行列进行数值的加减乘除等运算。例如

#%%

#总分基础上成10这个通过query做会报错
df["总分"]*10

结果:

四,melt逆透视函数用法 

 

标签:语文,cut,Python,melt,60,df,总分,query,where
来源: https://www.cnblogs.com/liupengpengg/p/13630979.html