同样我们使用上节课的DATA.xlsx文件来进行本节课的演示数据如下一、如何对DataFrame新增列1.1 直接运算实现我们新增一个“业绩总分” 列为“销售数量” 乘以 “客户评分”1234print(df.head(3))df.loc[:,业绩总分]df[销售数量]*df[客户评分]print(*60)print(df.head(3))输出如下可以发现运算过后最后多了一列业绩总分也就是成功新增了一列1.2 Apply方法增加列apply方法的直接使用用法是这样这里我们通过performance函数接受df然后进行判断根据不同的安全等级划分性能123456789defperformance(df):ifdf[安全等级]Aordf[安全等级]B:return好elifdf[安全等级]Cordf[安全等级]D:return一般# axis1 表示一行一行处理数据, 如果是一列一列处理数据的话就是 axis0df.loc[:,性能]df.apply(performance,axis1)print(df.head(3))输出结果如下可以看到通过apply方法我们也成功增加了一列性能产品经理 产品类别 地区 安全等级 销售额(元) 销售数量 客户评分 性能出库日期2023-06-01 Jerry 电子产品 西南 C 3789.6 12 5.0 一般2023-06-02 Cary 服装 华东 A 2345.3 14 5.0 好2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般还可以顺手通过value_counts()方法统计一下结果1print(df[性能].value_counts())# 统计不同性能情况的个数如果python基础好的话还可以通过推导式简化一下函数的写法1df[性能]df[安全等级].apply(lambdax:好ifxin[A,B]else一般)同时发现apply方法有一个axis参数表示传入进来的df是按行还是按列如果为1代表为行其实打印出来就发现结构其实是上面这样子因此可以通过df[XXXX]的形式取出来做判断然后再返回一个结果如果axis0那代表的就是按列传递其实每此传递都是一列索引一列数据的格式这种情况下我们可以对每列的数据做分析结构如下1.3 Assign方法同时我们也可以使用Assign方法得到一样的结果下面不管是map还是多加的[ ]都是为了将数据一行一行取出来具体map和apply这些方法怎么用我会在最后一节附录中给出来12345# 第一种写法dfdf.assign(性能df[安全等级].map(lambdax:好ifxin[A,B]else一般))# 第二种写法dfdf.assign(性能lambdax: [好ifxin[A,B]else一般forxindf[安全等级]])print(df.head(3))因此我们可以得到结果是产品经理 产品类别 地区 安全等级 销售额(元) 销售数量 客户评分 性能出库日期2023-06-01 Jerry 电子产品 西南 C 3789.6 12 5.0 一般2023-06-02 Cary 服装 华东 A 2345.3 14 5.0 好2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般1.3 通过条件语句进行新增列在下面的代码中我们先通过df[性能] 初始化一个空列然后依次赋值可以得到一样的结果1234df[性能]# 先初始化一个空列df.loc[df[安全等级].isin([A,B]),性能]好df.loc[df[安全等级].isin([C,D]),性能]一般print(df.head(3))二、pandas常见的数据统计类型2.1 数据特征统计pandas提供了非常强大的数据统计功能比如去重计数以及对数据特征做汇总比如我们先简单使用这样一句代码1print(df.describe())# 描述性统计描述性统计用于数据中的数值列计数求平均值标准差最小最大值和各个分位数销售额(元) 销售数量 客户评分count 606.000000 606.000000 606.000000mean 1381.760479 7.120462 4.327723std 868.101509 3.309942 0.390114min 345.600000 2.000000 3.50000025% 745.600000 5.000000 4.00000050% 987.600000 6.000000 4.30000075% 1876.400000 8.000000 4.600000max 4567.900000 21.000000 5.000000当然如果你只想要查看某个字段的具体指标的话可以通过单独打印实现:1234567print(df[销售额(元)].max())# 最大销售额print(df[销售额(元)].min())# 最小销售额print(df[销售额(元)].mean())# 平均销售额print(df[销售额(元)].median())# 中位数销售额print(df[[销售额(元),销售数量]].cov())# 协方差矩阵print(df[[销售额(元),销售数量]].corr())# 相关系数矩阵2.2 数据去重和分类汇总通过unique方法 我们能拿到去重之后的结果返回的是一个列表而通过value_counts我们能拿到各个子类的结果12345print(df[安全等级].unique())print(df[安全等级].value_counts())print(*60)# 分割线print(df[地区].unique())print(df[地区].value_counts())输出的结果如下[C A D B]安全等级C 175A 147B 146D 138Name: count, dtype: int64[西南 华东 西北 华北 华南 华中]地区华东 102西南 101华北 101华南 101华中 101西北 100Name: count, dtype: int64三、pandas对缺失值的处理我们有一个这样的EXCEL文件名为DATA_part.xlsx如图所示这个数据很不规范有以下几个典型特征A1单元格为空真正的数值前有空行空列存在合并单元格数据源中也存在空行3.1 判断是否为空值首先我们读取这个EXCEL使用skiprows跳过第一行12file_pathrC:\Users\22330\Desktop\进行中\DATA_part.xlsxdfpd.read_excel(file_path,skiprows1)# 跳过第一行得到如下的结果可以发现没有填充数据的部分都是NaN因此我们需要对数据进行清洗Unnamed: 0 产品经理 地区 销售数量 客户评分0 NaN Jerry 西南 12.0 5.01 NaN NaN 华东 14.0 5.02 NaN NaN 西北 7.0 3.73 NaN NaN NaN NaN NaN4 NaN Cary 西南 17.0 NaN5 NaN NaN 华东 19.0 10.06 NaN NaN 西北 12.0 8.77 NaN Bob-Smith 西南 15.0 8.08 NaN NaN 华东 17.0 8.09 NaN NaN 西北 10.0 6.7首先我们通过isnull来判断是否是空值注意两层sum才是对整个区域的缺失值求和12345print(df.isnull())# 打印缺失值print(*60)# 分割线print(df.isnull().sum())# 查看缺失值数量print(*60)# 分割线print(df.isnull().sum().sum())# 查看缺失值总数得到如下结果Unnamed: 0 产品经理 地区 销售数量 客户评分0 True False False False False1 True True False False False2 True True False False False3 True True True True True4 True False False False True5 True True False False False6 True True False False FalseUnnamed: 0 7产品经理 5地区 1销售数量 1客户评分 2dtype: int6416同样如果我们需要统计非空值那就使用notnull方法。3.2 丢弃空行空列在这里我们需要使用dropna方法里面主要有三个参数axis1, 代表按列方向axis0, 代表按行方向howall代表这个维度所有的为空才删除howany代表只要有空值就删除inplaceTrue代表替换原来的DataFrame否则不替换12df.dropna(axis1,howall,inplaceTrue)# 按列删除缺失值df.dropna(axis0,howall,inplaceTrue)# 按行删除缺失值执行以上过程后得到稍微干净一点的数据产品经理 地区 销售数量 客户评分0 Jerry 西南 12.0 5.01 NaN 华东 14.0 5.02 NaN 西北 7.0 3.74 Cary 西南 17.0 NaN5 NaN 华东 19.0 10.06 NaN 西北 12.0 8.73.3 空值填充接下来我们就需要对剩余的空值进行处理规范的DataFrame其实就是行和列每个位置都有有效的数据因此我们通过fillna方法将其进行填充其重要的主要有3个参数value, 代表你要将空值填为什么比如对于客户评分列就很适合这种填充methodffill代表用空值之前的内容填充比如产品经理列就很适合同样bfill代表用空值后续的值填充inplaceTrue代表替换原来的DataFrame否则不替换12df[客户评分].fillna(value0,inplaceTrue)# 填充缺失值df[产品经理].fillna(methodffill,inplaceTrue)# 填充缺失值经过这样处理之后得到的结果为产品经理 地区 销售数量 客户评分0 Jerry 西南 12.0 5.01 Jerry 华东 14.0 5.02 Jerry 西北 7.0 3.74 Cary 西南 17.0 0.05 Cary 华东 19.0 10.06 Cary 西北 12.0 8.7这样子我们再直接写到另一个工作簿就非常完美了但是要注意使用indexFalse防止将DataFrame的索引列也写回。1df.to_excel(rC:\Users\22330\Desktop\进行中\DATA_part_clean.xlsx,indexFalse)# 保存到新文件我们打开保存之后的DATA_part_clean.xlsx文件就发现清洗后的数据已经放在表格内了附录ApplyMapApplyMap的使用差异在下面的案例中我们需要将A:区域A,B:区域B,C:区域C做一个一一替换使用了四种不同的方式都能得到最后的结果apply方法结合lambda函数取出字典中的值然后写回applymap方法遍历整个DataFrame,发现有符合的键则进行相应的值替换但是需要注意此方法只适用于DataFramemap方法既可以支持DataFrame又可以支持Seriesreplace方法取出对应的列索引然后进行字典替换