
第1关Pandas数值运算方法任务描述本关任务获取鸢尾花数据集前30行并转换成DataFrame然后让每一行都减去第一行的值输出运算后的结果。相关知识Pandas在数值运算方面继承了NumPy的通用函数等功能实现了一些高效技巧。通用函数保留索引因为Pandas是建立在NumPy基础之上的所以NumPy的通用函数同样适用于Pandas的Series和DataFrame对象。import numpy as npimport pandas as pdrng np.random.RandomState(42) #创建随机数种子ser pd.Series(rng.randint(0,10,4))df pd.DataFrame(rng.randint(0,10,(3,4)), columns[A,B,C,D])# 对Series对象使用Numpy通用函数生成的结果是另一个保留索引的Pands对象print(np.exp(ser))Out0 403.4287931 20.0855372 1096.6331583 54.598150dtype: float64# 对DataFrame使用Numpy通用函数print(np.sin(df*np.pi/4))Out:A B C D0 -1.000000 7.071068e-01 1.000000 -1.000000e001 -0.707107 1.224647e-16 0.707107 -7.071068e-012 -0.707107 1.000000e00 -0.707107 1.224647e-16通用函数索引对齐Series索引对齐假如你要整合两个数据源的数据其中一个是美国面积最大的三个州的面积数据另一个是美国人口最多的三个州的人口数据# 面积areapd.Series({Alaska:1723337,Texas:695662,California:423967},namearea)# 人口populationpd.Series({California:38332521,Texas:26448193,New York: 19651127}, namepopulation})人口除以面积的结果print(population/area)Out:Alaska NaNCalifornia 90.413926New York NaNTexas 38.018740dtype: float64对于缺失的数据Pandas会用NaN填充表示空值。这是Pandas表示缺失值的方法后面的关卡会介绍。这种索引对齐方式是通过Python内置的集合运算规则实现的任何缺失值默认都用NaN填充。DataFrame索引对齐在计算两个DataFrame时类似的索引对齐规则也同样会出现在共同列中A pd.DataFrame(rng.randint(0, 20, (2, 2)), columnslist(AB))A:A B0 1 111 5 1B pd.DataFrame(rng.randint(0, 10, (3, 3)), columnslist(BAC))B:B A C0 4 0 91 5 8 02 9 2 6print(A B)Out:: A B C0 1.0 15.0 NaN1 13.0 6.0 NaN2 NaN NaN NaN从上面的例子可以发现两个对象的行列索引可以是不同顺序的结果的索引会自动按顺序排列。在Series中我们可以通过运算符方法的 fill_value参数自定义缺失值这里我们将用A中所有值的均值来填充缺失值。fill A.stack().mean() # stack()能将二维数组压缩成多个一维数组print(A.add(B,fill_valuefill))Out:A B C0 1.0 15.0 13.5 #NaN值都变成了均值1 13.0 6.0 4.52 6.5 13.5 10.5下表中列举了与Python运算符相对应的Pandas对象方法。Python运算符 Pandas方法 add()- sub()、subst\fract()* mul()、multiply()/ truediv()、div()、divide()// floordiv()% mod()** pow()通用函数DataFrame与Series的运算DataFrame和Series的运算规则与Numpy中二维数组与一维数组的运算规则是一样的。来看一个常见运算让一个二维数组减去自身的一行数据。A rng.randint(10, size(3, 4))A - A[0]Out:array([[ 0, 0, 0, 0],[-1, -2, 2, 4],[ 3, -7, 1, 4]]) # 根据Numpy的广播规则默认是按行运算的在Pandas里默认也是按行运算的如果想按列计算那么就需要利用前面介绍过的运算符方法通过设置axis(轴)实现。df pd.DataFrame(A, columnslist(QRST))print(df - df.iloc[0])Out:Q R S T0 0 0 0 01 -1 -2 2 42 3 -7 1 4print(df.subt\fract(df[R],axis0))Out:Q R S T0 -5 0 -6 -41 -4 0 -2 22 5 0 2 7DataFrame/Series的运算与前面介绍的运算一样结果的索引都会自动对齐。编程要求本关的编程任务是补全右侧上部代码编辑区内的相应代码要求实现如下功能获取鸢尾花数据集的前30行将数据转换为DataFrame列名为[a,b,c,d]最后将每一行都减去第一行的值输出运算后的结果具体要求请参见后续测试样例。请先仔细阅读右侧上部代码编辑区内给出的代码框架再开始你的编程工作测试说明平台会对你编写的代码进行测试对比你输出的数值与实际正确的数值只有所有数据全部计算正确才能进入下一关。测试输入无测试输入预期输出开始你的任务吧祝你成功import pandas as pd from sklearn import datasets def demo1(): iris datasets.load_iris().data # 鸢尾花数据集返回的是array #********** Begin **********# df pd.DataFrame(iris[:30], columns[a, b, c, d]) df df - df.iloc[0] print(df) #********** End **********#第3关缺失值处理任务描述本关任务按照编程要求完成任务并输出目标DataFrame。相关知识Pandas提供了一些方法来发现、剔除、替换数据结构中的缺失值主要包括以下几种isnull() # 创建一个布尔类型的掩码标签缺失值。notnull() # 与isnull()相反即缺失值为Falsedropna() # 返回一个提出缺失值的数据fillna() # 返回一个填充了缺失值的数据副本发现缺失值Pandas有两种方法可以发现缺失值isnull()和notnull()这俩个中方法皆可用于Series和DataFrame。每种方法都返回布尔类型的掩码数据。datapd.Series([1,np.nan,hello,None])data.isnull()Out:0 False1 True2 False3 Truedtype: bool布尔类型掩码数组可以直接作为Series或DataFrame的索引使用。data[data.notnull()]Out:0 12 hellodtype: object处理缺失值dropna()删除缺失值作用在Series对象上时它的作用和data[data.notnull()]一样而在DataFrame上使用它们时需要设置一些参数df pd.DataFrame([[1, np.nan, 2],[2, 3, 5],[np.nan, 4, 6]])# 如果不传任何参数时dropna会删除有缺失值的所有行df.dropna()Out:0 1 21 2.0 3.0 5# 传入axis1(或者axiscolumns)时会删除所有包含缺失值的列df.dropna(axis1)Out:20 21 52 6但是这么做也会把非缺失值一并剔除因为可能有时候只需要剔除全部是缺失值的行或列或者绝大多数是缺失值的行或列。这些需求可以通过设置how或thresh参数来满足它们可以设置剔除行或列缺失值的数量阈值。df[3] np.nanOut:0 1 2 30 1.0 NaN 2 NaN1 2.0 3.0 5 NaN2 NaN 4.0 6 NaN# 删除值全部为缺失值的列df.dropna(axis1,howall)Out0 1 20 1.0 NaN 21 2.0 3.0 52 NaN 4.0 6#通过 thresh 参数设置行或列中非缺失值的最小数量df.dropna(axisrows, thresh3) #非缺失值至少有3个Out:0 1 2 31 2.0 3.0 5 NaNfillna()填充缺失值 有时候你可能并不想移除缺失值而是想把它们替换成有效的数值。虽然你可以通过isnull()方法建立掩码来填充缺失值但是Pandas为此专门提供了一个fillna()方法它将返回填充了缺失值后的数组副本。datapd.Series([1, np.nan, 2, None, 3],indexlist(abcd)data.fillna(0) # 将缺失值填充为0Outa 1.0b 0.0c 2.0d 0.0e 3.0dtype: float64可以用缺失值前面的有效值来从前往后填充forward-fill也可以用缺失值后面的有效值来从后往前填充back-filldata.fillna(methodffill)Outa 1.0b 1.0c 2.0d 2.0e 3.0dtype: float64data.fillna(methodbfill)Outa 1.0b 2.0c 2.0d 3.0e 3.0dtype: float64DataFrame的操作方法与Series类似只是在填充时需要设置坐标轴参数axis。df.fillna(methodffill, axis1) # bfill同样适用Out0 1 2 30 1.0 1.0 2.0 2.01 2.0 3.0 5.0 5.02 NaN 4.0 6.0 6.0编程要求本关的编程任务是补全右侧上部代码编辑区内的相应代码要求实现如下功能获取鸢尾花数据集并转换成DataFrame对象列名为a,b,c,d获取DataFrame对象的前30行使用sub()进行减法运算将每一行都减去第一行的值将所有小于0的值转成缺失值删除非缺失值数量最小为2的行最后再从前往后填充缺失值并输出结果具体要求请参见后续测试样例。请先仔细阅读右侧上部代码编辑区内给出的代码框架再开始你的编程工作测试说明平台会对你编写的代码进行测试对比你输出的数值与实际正确的数值只有所有数据全部计算正确才能进入下一关。测试输入无测试输入预期输出开始你的任务吧祝你成功import numpy as np import pandas as pd from sklearn import datasets def demo3(): iris datasets.load_iris().data #********** Begin **********# df pd.DataFrame(iris, columns[a, b, c, d]) df df.head(30) df df.sub(df.iloc[0], axis1) df[df 0] np.nan df df.dropna(thresh2) df df.ffill() print(df) #********** End **********#第4关Pandas分组聚合任务描述本关任务使用Pandas加载drinks.csv文件中的数据根据数据信息求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。相关知识分组聚合的流程主要有三步分割步骤将DataFrame按照指定的键分割成若干组应用步骤对每个组应用函数通常是累计、转换或过滤函数组合步骤将每一组的结果合并成一个输出数组。分组通常我们将数据分成多个集合的操作称之为分组Pandas中使用groupby()函数来实现分组操作。单列和多列分组对分组后的子集进行数值运算时不是数值的列会自动过滤import pandas as pddata {A: [1, 2, 2, 3, 2, 4],B: [2014, 2015, 2014, 2014, 2015, 2017],C: [a, b, c, d, e, f],D: [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]}df pd.DataFrame(data)df.groupby(B) #单列分组 返回的是一个groupby对象df.groupby([B,C]) #多列分组Series系列分组选取数据帧中的一列作为index进行分组df[A].groupby(df[B]) #df的 A 列根据 B 进行分组通过数据类型或者字典分组数据类型分组df.groupby(df.dtypes,axis1) # axis1表示按列分组以数据类型为列名传入字典分组:dic {A: number, B: number, C: str, D: number}df.groupby(dic, axis1) #按列分组列名是字典的值获取单个分组使用get_group()方法可以选择一个组。df.groupby(A).get_group(2)输出A B C D1 2 2015 b 0.92 2 2014 c 2.14 2 2015 e 0.5对分组进行迭代GroupBy对象支持迭代可以产生一组二元元组由分组名和数据块组成。for name,data in df.groupby(A):print(name)print(data)输出1A B C D0 1 2014 a 0.52A B C D1 2 2015 b 0.92 2 2014 c 2.14 2 2015 e 0.53A B C D3 3 2014 d 1.54A B C D5 4 2017 f 0.1聚合聚合函数为每个组返回单个聚合值。当创建了groupby对象就可以对分组数据执行多个聚合操作。比较常用的是通过聚合函数或等效的agg方法聚合。常用的聚合函数如下表函数名 说明count 分组中非空值的数量sum 非空值的和mean 非空值的平均值median 非空值的中位数std、var 无偏标准差和方差min、max 非空值的最小和最大值prod 非空值的积first、last 第一个和最后一个非空值应用单个聚合函数对分组后的子集进行数值运算时不是数值的列会自动过滤import pandas as pdimport numpy as npdata {A: [1, 2, 2, 3, 2, 4],B: [2014, 2015, 2014, 2014, 2015, 2017],C: [a, b, c, d, e, f],D: [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]}df pd.DataFrame(data)df.groupby(B).sum() #对分组进行求和应用多个聚合函数df.groupby(B).agg([np.sum,np.mean,np.std])自定义函数传入agg()中def result(df):return df.max() - df.min()df.groupby(B).agg(result) #求每一组最大值与最小值的差对不同的列使用不同的聚合函数mapping {A:np.sum,B:np.mean}df.groupby(C).agg(mapping)编程要求使用Pandas中的read_csv()函数读取step1/drinks.csv中的数据数据的列名如下表所示请根据continent分组并求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。在右侧编辑器begin-end处补充代码。列名 说明country 国家名beer_servings 啤酒消耗量spirit_servings 白酒消耗量wine_servings 红酒消耗量total_litres_of_pure_alcohol 纯酒精总量continent 大洲名测试说明平台会对你编写的代码进行测试测试输入预期输出wine_servings beer_servingscontinentAfrica 233 3258Asia 123 1630Europe 370 8720North America 99 3345Oceania 212 1435South America 220 2101开始你的任务吧祝你成功import pandas as pd import numpy as np #返回最大值与最小值的差 def sub(df): ######## Begin ####### return df.max() - df.min() ######## End ####### def main(): ######## Begin ####### df pd.read_csv(step4/drinks.csv) result df.groupby(continent).agg({wine_servings: sub, beer_servings: sum}) print(result) ######## End ####### if __name__ __main__: main()第5关Pandas创建透视表和交叉表任务描述本关任务使用Pandas加载tip.csv文件中的数据集分别用透视表和交叉表统计顾客在每种用餐时间、每个星期下的小费总和情况。相关知识透视表透视表是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合并根据行和列上得分组建将数据分配到各个矩形区域中。在pandas中可以通过pivot_table函数创建透视表。pivot_talbe函数的参数DataFrame.pivot_table(self, valuesNone, indexNone, columnsNone,ggfuncmean, fill_valueNone, .marginsFalse,dropnaTrue, margins_nameAll)参数名 说明values 待聚合的列的名称。默认聚合所有数值列index 用于分组的列名或其他分组键出现在结果透视表的行columns 用于分组的列名或其他分组键出现在结果透视表的列aggfunc 聚合函数或函数列表默认为mean可以是任何对groupby有效的函数fill_value 用于替换结果表中的缺失值dropna boolean值默认为Truemargins_name string默认为‘ALL’当参数margins为True时ALL行和列的名字示例data {A: [1, 2, 2, 3, 2, 4],B: [2014, 2015, 2014, 2014, 2015, 2017],C: [a, b, c, d, e, f],D: [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]}df pd.DataFrame(data)df.pivot_table(index[B], columns[C], values[A], aggfuncsum, marginsTrue)输出AC a b c d e f AllB2014 1.0 NaN 2.0 3.0 NaN NaN 62015 NaN 2.0 NaN NaN 2.0 NaN 42017 NaN NaN NaN NaN NaN 4.0 4All 1.0 2.0 2.0 3.0 2.0 4.0 14交叉表交叉表是一种用于计算分组频率的特殊透视表。通常使用crosstab函数来创建交叉表。crosstab的参数pd.crosstab(index,columns,valuesNone,rownamesNonecolnamesNone,aggfuncNone,marginsFalse,dropnaTrue,normalizeFalse)其中rownames可以设置行名colnames可以设置列名而且前两个参数可以是数组、Series或数组列表。示例data {A: [1, 2, 2, 3, 2, 4],B: [2014, 2015, 2014, 2014, 2015, 2017],C: [a, b, c, d, e, f],D: [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]}df pd.DataFrame(data)pd.crosstab(index[df[B],df[A]], columnsdf[C], valuesdf[A], aggfuncsum, marginsTrue)输出C a b c d e f AllB A2014 1 1.0 NaN NaN NaN NaN NaN 12 NaN NaN 2.0 NaN NaN NaN 23 NaN NaN NaN 3.0 NaN NaN 32015 2 NaN 2.0 NaN NaN 2.0 NaN 42017 4 NaN NaN NaN NaN NaN 4.0 4All 1.0 2.0 2.0 3.0 2.0 4.0 14编程要求使用Pandas中的read_csv函数加载step2/tip.csv文件中的数据集分别用透视表和交叉表统计顾客在每种用餐时间(time) 、每个星期下(day) 的 小费(tip)总和情况。在右侧编辑器begin-end处补充代码。数据集列名信息如下表列名 说明total_bill 消费总账单tip 小费金额day 消费日期星期几time 用餐时间段早、中、晚size 吸烟数量测试说明平台会对你编写的代码进行测试测试输入预期输出透视表tiptime Dinner Lunch AlldayFri 35.28 16.68 51.96Sat 260.40 NaN 260.40Sun 247.39 NaN 247.39Thur 3.00 168.83 171.83All 546.07 185.51 731.58交叉表time Dinner Lunch AlldayFri 35.28 16.68 51.96Sat 260.40 NaN 260.40Sun 247.39 NaN 247.39Thur 3.00 168.83 171.83All 546.07 185.51 731.58开始你的任务吧祝你成功#-*- coding: utf-8 -*- import pandas as pd #创建透视表 def create_pivottalbe(data): ###### Begin ###### return pd.pivot_table(data, values[tip], indexday, columnstime, aggfuncsum, marginsTrue) ###### End ###### #创建交叉表 def create_crosstab(data): ###### Begin ###### return pd.crosstab(indexdata[day], columnsdata[time], valuesdata[tip], aggfuncsum, marginsTrue) ###### End ###### def main(): #读取csv文件数据并赋值给data ###### Begin ###### data pd.read_csv(step5/tip.csv) ###### End ###### piv_result create_pivottalbe(data) cro_result create_crosstab(data) print(透视表\n{}.format(piv_result)) print(交叉表\n{}.format(cro_result)) if __name__ __main__: main()