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

举报
诡途 发表于 2021/11/19 01:49:47 2021/11/19
【摘要】 阅读助手 构造测试数据方法一:映射 apply |map + lambda方法二:映射 apply + def方法三:nupmy内置函数-np.where方法四:nupmy内置函数-np.sele...

构造测试数据

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

方法一:映射 apply |map + lambda

# 方法一  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 "优")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

方法二:映射 apply + def

# 方法二 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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

# 方法三 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,"良","优"))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

方法五 数据分箱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”=[1234]表示(1,2],(2,3],3,4]
当bins是一个间隔索引时,该参数被忽略。
labels : 数组或布尔值,可选.指定分箱的标签

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

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

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

duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
# 方法五 数据分箱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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

文章来源: blog.csdn.net,作者:诡途,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_35866846/article/details/119206829

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。