前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >五大方法添加条件列-python类比excel中的lookup

五大方法添加条件列-python类比excel中的lookup

作者头像
诡途
发布2022-01-07 08:21:29
1.8K0
发布2022-01-07 08:21:29
举报
文章被收录于专栏:诡途的python路诡途的python路

阅读助手

构造测试数据

代码语言:javascript
复制
import numpy as np
import pandas as pd
import random
# 随机生成20名同学,语数外三科成绩
df = pd.DataFrame(np.array([random.randint(40,100) for i in range(60)]).reshape(20,3),columns=["语文","数学","英语"])
df['总成绩'] = df.sum(axis=1)
df

添加一列条件列,给成绩评级,评级规则如下:

  • 差: 总成绩 < 180
  • 良 :180~ 240(含180不含240)
  • 优 : >=240

这是一个excel学习中很经典的案例,先构造评级参数表,然后直接用lookup匹配就可以了,具体不在这讲了,今天讲一下用python怎么实现该功能,总共五种(三大类:映射+numpy+pandas分箱)方法,提前预告下,最后一种数据分箱是与excel 中的 lookup最像的

方法一:映射 apply |map + lambda

代码语言:javascript
复制
# 方法一  apply |map + lambda
df1 = df.copy()
df1['评级'] = df1['总成绩'].apply(lambda x: "差" if x <180 else "良" if x<240 else "优")


df4 = df.copy()
df4['总成绩'].map(lambda x: "差" if x <180 else "良" if x<240 else "优")

方法二:映射 apply + def

代码语言:javascript
复制
# 方法二 apply + def
df2 = df.copy()
def test(data):
    if data < 180:
        return "差"
    elif data <240:
        return "良"
    else:
        return "优"

df2['评级'] = df2['总成绩'].apply(test)


df3 = df.copy()
def test2(data):
    total_score = data.values[-1]
    if total_score < 180:
        return "差"
    elif total_score <240:
        return "良"
    else:
        return "优"
df3['评级'] = df3.apply(test2,axis = 1)

方法三:nupmy内置函数-np.where

代码语言:javascript
复制
# 方法三 np.where
df5 = df.copy()
# Numpy的内置where()函数。这个函数依次接受三个参数:条件;如果条件为真,分配给新列的值;如果条件为假,分配给新列的值
# np.where(condition, value if condition is true, value if condition is false)
df5['评级'] = np.where(df5['总成绩']<180,"差",np.where(df5['总成绩']<240,"良","优"))

方法四:nupmy内置函数-np.select

代码语言:javascript
复制
# 方法四 np.select
# np.select()的函数,给它提供两个参数:一个条件,另一个对应的等级列表。
# 在conditions列表中的第一个条件得到满足,values列表中的第一个值将作为新特征中该样本的值,以此类推

df6 = df.copy()
conditions = [
    (df6['总成绩'] < 180),
    (df['总成绩'] >= 180) & (df6['总成绩'] <240),
    (df6['总成绩'] >= 240)
    ]
values = ['差','良','优']
df6['评级'] = np.select(conditions,values)

方法五:数据分箱pd.cut()——最类似于excel中的lookup

代码语言:javascript
复制
方法五 数据分箱pd.cut()——最类似于excel 中 lookup的方法


pd.cut( x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', )

x : 一维数组(对应前边例子中提到的总成绩)

bins :整数,标量序列或者间隔索引,是进行分组的依据,

如果填入整数n,则表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);
如果是标量序列,序列中的数值表示用来分档的分界值
如果是间隔索引,“ bins”的间隔索引必须不重叠
right :布尔值,默认为True表示包含最右侧的数值

当“ right = True”(默认值)时,则“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]
当bins是一个间隔索引时,该参数被忽略。
labels : 数组或布尔值,可选.指定分箱的标签

如果是数组,长度要与分箱个数一致,比如“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]一共3个区间,则labels的长度也就是标签的个数也要是3
如果为False,则仅返回分箱的整数指示符,即x中的数据在第几个箱子里
当bins是间隔索引时,将忽略此参数
retbins: 是否显示分箱的分界值。默认为False,当bins取整数时可以设置retbins=True以显示分界值,得到划分后的区间

precision:整数,默认3,存储和显示分箱标签的精度。

include_lowest:布尔值,表示区间的左边是开还是闭,默认为false,也就是不包含区间左边。

duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一
代码语言:javascript
复制
# 方法五 数据分箱pd.cut()——最类似于excel 中 lookup的方法
df7 = df.copy()
bins = [0,180,240,300.1]
labels = ['差','良','优']
df6['评级'] = pd.cut(df6['总成绩'],bins,right=False,labels=labels,include_lowest=True)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 阅读助手
  • 构造测试数据
  • 方法一:映射 apply |map + lambda
  • 方法二:映射 apply + def
  • 方法三:nupmy内置函数-np.where
  • 方法四:nupmy内置函数-np.select
  • 方法五:数据分箱pd.cut()——最类似于excel中的lookup
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档