在用pandas预处理数据时,难免需要自己构造一些有价值的数据,applymap函数和map函数对于处理此类问题十分方便。
给定一个DataFrame,含有每个学生的第一次考试和第二次考试的成绩,现在让你将分数转化成ABCD和 ‘ 不及格 ’ 等级。
首先来看DataFrame中的applymap函数:数据参考自
grades_df = pd.DataFrame(data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio', 'Fred', 'Greta', 'Humbert', 'Ivan', 'James']
)def convert_to_letter(score):if (score >= 90):return 'A'elif (score >= 80):return 'B'elif (score >= 70):return 'C'elif (score >= 60):return 'D'else:return '不及格'def convert_grades(grades):return grades.applymap(convert_to_letter)print (convert_grades(grades_df))输出如下:exam1 exam2
Andre 不及格 不及格
Barry B D
Chris C 不及格
Dan C 不及格
Emilio B D
Fred C 不及格
Greta A C
Humbert D 不及格
Ivan A C
James B D
针对Series类型数据或者是DataFrame类型数据中的某一列,使用map函数而不是applymap函数
样例1:
给定data数据集,让你对 ‘ 是否入党 ’ 这一列,进行维护。原数据集里面,是年份或空值(NaN),但是我们不关心年份的多少,我们只关心是否入党,所以我们要将这一列替换成0或者1.
#是否入党
data["join_party"]=data["join_party"].map(lambda x:0 if pd.isnull(x) else 1)
其中lambda是匿名函数,意思是如果这一行的'join_party'这一列是控制的话则变成0,否则变成1,x可以理解成传入的参数。
样例2:
利用data数据集中的‘birth’这一列(每一个数据都是年份),新生成一列'birth_s',代表年代。
#出生的年代
def birth_split(x):if 1920<=x<=1930:return 0elif 1930<x<=1940:return 1elif 1940<x<=1950:return 2elif 1950<x<=1960:return 3elif 1960<x<=1970:return 4elif 1970<x<=1980:return 5elif 1980<x<=1990:return 6elif 1990<x<=2000:return 7data["birth_s"]=data["birth"].map(birth_split)
样例3:
将收入进行分组,新增一列‘income_cut’来代表几个工资段:
#收入分组
def income_cut(x):if x<0:return 0elif 0<=x<1200:return 1elif 1200<x<=10000:return 2elif 10000<x<24000:return 3elif 24000<x<40000:return 4elif 40000<=x:return 5data["income_cut"]=data["income"].map(income_cut)