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

2022-01-07 08:21:29 浏览数 (1)

阅读助手

  • 构造测试数据
  • 方法一:映射 apply |map lambda
  • 方法二:映射 apply def
  • 方法三:nupmy内置函数-np.where
  • 方法四:nupmy内置函数-np.select
  • 方法五:数据分箱pd.cut()——最类似于excel中的lookup

构造测试数据

代码语言: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)

0 人点赞