阅读助手
- 构造测试数据
- 方法一:映射 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)