当前位置: 首页 > news >正文

织梦视频网站源码棋牌游戏开发多少钱

织梦视频网站源码,棋牌游戏开发多少钱,区块链媒体网站建设,wordpress简介- 第 106 篇 - Date: 2025 - 06 - 12 Author: 郑龙浩#xff08;仟墨#xff09; 文中使用的所有文件在文章顶部的资源展示 数据分析与处理 「pandas 与 numpy」 文章目录 数据分析与处理 「pandas 与 numpy」一了解数据处理1 数据处理2 数据分析第三方库 二 numpy1 基本介绍…- 第 106 篇 - Date: 2025 - 06 - 12 Author: 郑龙浩仟墨 文中使用的所有文件在文章顶部的资源展示 数据分析与处理 「pandas 与 numpy」 文章目录 数据分析与处理 「pandas 与 numpy」一了解数据处理1 数据处理2 数据分析第三方库 二 numpy1 基本介绍2 导入库3 数组与列表的区别4 ndarray 对象 numpy的数组对象5 **创建方式**6 数组ndarray的常用属性7 numpy 的随机函数7.1 基本随机函数固定区间范围7.2 分布随机函数7.3 代码示例 8 numpy 常用统计函数8.1 函数统计8.2 axis怎么用 三 pandas1 pandas主要介绍2 pandas与numpy的区别3 导入 pandas 库4 pandas 的数据结构4.1 区别4.2 二者联系 5 Series 数据类型5.1 基本介绍5.2 创建方式 5 DataFrame数据类型5.1 基本介绍5.2 DataFrame的创建5.3 DataFrame的属性5.4 访问某行或某列 6 DataFrame与Series相互转换6.1 DataFrame转Series6.2 Series转DataFrame 7 简单运算7.1 行方向求和/平均值 – 横向求7.2 列方向求和/平均值 – 纵向求 8 常用函数8.1rename()8.2insert()8.3drop()8.4 head()8.5tail() 四 pandas数据读写1 Excel 文件读取1.1 函数语法1.2 具体实现 2 Excel文件写入 – pd.to_excel(...)2.1 函数语法2.2 具体实现 3 Excel文件写入 – df.ExcelWriter(...)3.1 函数语法3.2 具体实现 3 toexcel 与 ExcelWriter 的区别与联系3.1 区别3.2 联系 4 CSV 文件写入与读取4.1 函数语法4.2 具体实现1. **写入CSV文件df.to_csv**2. **读取CSV文件pd.read_csv** 5 其他格式文件读写 五 pandas 数据筛选1 基本介绍2 直接筛选2.1 介绍2.2 实现 3 条件筛选2.1 介绍2.2 实现 4 索引器筛选 - loc索引器4.1 介绍4.2 loc 索引 (location的缩写) 4.3 loc 索引 (integer location的缩写) 六 pandas 数据特征分析1 简单统计分析1.1 基本介绍1.3 示例 2 数据排序2.1 基本介绍2.2 函数的常用参数2.3 示例1 – sort_values2.3 示例1 – sort_values 3 累计函数3.1 基本介绍3.2 示例 七 数据合并1 基本了解2 merge() 函数2.1 介绍2.2 连接键时参数的使用冲突**1. 连接键指定冲突****2. 索引参数冲突****3. 多列连接规则**2.3 示例1 3 concat() 函数3.1 介绍3.2 示例1 – 纵向连接3.3 示例2 – 横向连接 八 数据清洗1 基本介绍2 重复值处理2.1 duplicated () 函数 2.2 drop_duplicates()函数2.2.1 基本介绍2.2.2 示例 3 缺失值处理3.1 介绍3.2 isna()函数3.3 dropna 函数3.3 fillna 函数 4 特殊字符删除5 数据类型更改6 示例 九 pandas 高阶函数1 Series.map() 方法1.1 介绍2.2 示例12.3 示例2 2 Series/DataFrame.apply(function,args,axis) 方法2.1 介绍2.2 示例12.3 示例2 3 DataFrame.applymap(function)3.1 介绍3.2 示例 十 pandas数据分组聚合1 介绍2 分组 – DataFrame.groupby() 函数2.1 介绍2.2 查看分组结果的方法2.3 函数语法2.4 示例 3 聚合 – DataFrame.agg() 函数3.1 介绍3.2 函数语法3.3 怎么用这个函数3.4 示例1 十一 pandas 数据透视表与轴向转换1 基本介绍1.1 数据透视表1.2 轴向转换 2 DataFrame.pivot_table()2.1 介绍2.2 函数语法2.3 示例 3 DataFrame.stack 与 DataFrame.unstack3.1 介绍3.2 函数语法3.3 两者区别3.4 示例 一了解数据处理 1 数据处理 数据处理通常值数据预处理 流程数据清洗-数据建模-数据加工 在真实世界中数据通常是不完整的(缺少某些感兴趣的属性值)、不一致的(包含代码或者名称的差异)、极易受到噪声(错误或异常值)的侵扰的。因为数据库太大而且数据集经常来自多个异构数据源低质量的数据将导致低质量的数据分析挖掘结果因此必须对采集(爬取)到的数据进行预处理。 2 数据分析第三方库 该笔记主要记录 numpy与pandas库 数据分析库说明NumPy提供了数组功能以及对数据进行快速处理的函数是Python中相当成熟和常用的库。Pandas是Python下最强大的数据分析和探索工具包含高级的数据结构和精巧的工具支持数据增、删、查、改并有丰富的数据处理函数支持时间序列分析功能灵活处理缺失数据等。SciPy依赖于NumPy安装前需先安装NumPy。SciPy包含的功能有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理和图像处理等其他科学与工程中常用的计算。Matplotlib是最著名的绘图库主要用于二维绘图。它提供了一整套丰富的命令让我们可以非常快捷地用Python可视化数据而且允许输出达到出版质量的多种图像格式。 二 numpy 1 基本介绍 numpy 是 Python 语言的一个扩展程序库支持大量的维度数组与矩阵运算此外也针对数组运算提供大量的数学函数库。NumPy是SciPy、Pandas、Matplotlib等数据处理或科学计算库的基础。 一个强大的N维数组对象ndarray;广播功能函数矩阵的加减法、点乘等:线性代数、傅里叶变换、随机数生成等功能 2 导入库 引入库的注意事项 通过输入代码import numpy as np方式引入NumPy库其中 np 为引入模块的别名别名可以省略或更改但建议使用约定的别名(np)。引入后Numpy中的函数就可以直接使用了。 举例 # 导入 numpy 库 import numpy as np arr np.arange(5) # [0, 1, 2, 3, 4]3 数组与列表的区别 在Python语言中已经有了列表类型并且列表类型可以表示一维数据和多维数据为什么还需要数组类型(ndarray)呢? 根本原因当然是numpy 的运行速度要比 Python 自带的列表要快很多当数据量大的时候更加明显 举例计算 a**6 b**6 c**6a,b,c均为一维数组 代码 import numpy as np import pandas as pd import time# 传统方法 -- 使用普通列表 List 的形式 def SumCheck1():a [x for x in range(1, 6)]b [x for x in range(6, 11)]c [x for x in range(11, 16)]SUM [] # 设为空列表for i in range(len(a)):SUM.append(a[i]**6 b[i]**6 c[i]**6)return SUM# 新方法 -- 使用 numpy 的函数 def SumCheck2():a np.arange(1, 6)b np.arange(6, 11)c np.arange(11, 16)SUM a**6 b**6 c**6 # 不需要 写循环挨个去加了直接利用numpy的运算规则就可以算出来return SUMstart time.time() SumCheck1() end time.time()start2 time.time() SumCheck1() end2 time.time()print(f纯python\n{end - start:.20f}秒, ) print(f用numpy\n{end2 - start2:.20f}秒, )打印结果 使用的计算时间的方法可能精度并不高很容易有误差但是大概率也能看出来用numpy比列表速度要快 纯python 0.00001263618469238281秒 用numpy 0.00000619888305664062秒4 ndarray 对象 numpy的数组对象 介绍 NumPy是Python科学计算的核心库其最重要的特性就是提供了ndarrayN-dimensional array对象用于高效存储和处理同类型数据的多维数组。 ndarray的组成 组成部分说明数据缓冲区实际存储数据的连续内存块固定类型的二进制数据元数据描述数据的属性 • shape形状如(3,4) • dtype数据类型 • strides内存步长 5 创建方式 注意numpy库的核心就是ndarray对象 ndarray对象不能直接创建如arr np.ndarray()是错误的而是需要通过NumPy提供的工厂函数生成如np.arrange(), np.array(), np.zeros()等等返回的内容都是ndarray对象也就是ndarray只是一种抽象的表达告诉我们这是个对象 # 创建方式返回的都是ndarray对象 arr1 np.array([1, 2, 3]) # 从现有数据创建 arr2 np.arange(5) # 生成序列 [0,1,2,3,4] arr3 np.zeros((2,3)) # 创建全零数组 arr4 np.random.rand(4,4) # 生成随机数组 arr np.ndarray() # 是错误的!!不能直接实例化ndarray类np.array(list/tuple) – 创建方式1 使用列表/元组/其他数组来创建 参数可以是 列表 或者 元组会自动将列表或者元组转换为 ndarray对象 # 从列表创建 lis [x for x in range(1, 6)] arr1 np.array(lis) print(arr1)# 从元组创建 tup tuple(lis) arr2 np.array(tup) print(arr2)打印结果 [1 2 3 4 5] [1 2 3 4 5]np.arange(start,stop,step, dtypeNone)– 创建方式2 生成序列来创建 start可选默认为0 序列的起始值包含该值 stop必需 序列的结束值不包含该值例如 np.arange(3) 生成 [0, 1, 2] step可选默认为1 相邻数值的间隔步长支持整数和浮点数可以是正数递增或负数递减例如 np.arange(1, 5, 0.5) 生成 [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5] dtype可选 输出数组的数据类型如 np.float32、np.int64、float、int 若Python类型会自动映射float– np.float64、int– np.int64、 未指定时自动推断 6 数组ndarray的常用属性 注意属性不是方法下面的属性和方法是两种不同的概念不要混淆。 属性不带括号方法带着括号 举例代码 import numpy as np # 导入numpy库 arr np.array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])[[0 1 2 3 4][5 6 7 8 9]]属性说明实例结果ndim轴的数量或维度的数量**行数**arr.ndim2shape数组的形状对于矩阵n行m列形状为(n,m)arr.shape(2, 5)size数组元素的总个数相当于shape中n*m的值arr.size10dtypendarray对象的元素类型arr.dtypedtype(int32)itemsizendarray对象中每个元素的大小以字节为单位arr.itemsize4 7 numpy 的随机函数 7.1 基本随机函数固定区间范围 返回固定区间范围的随机数 函数范围说明作用返回内容random.rand(d0, d1, ..., dn)[0, 1)d0表示第0轴元素个数依此类推至dn生成[0,1)范围内的浮点随机数ndarrayrandom.randint(low, highNone, sizeNone)[low, high)size为输出数组的形状生成[low, high)范围内的整型随机数范围左闭右开ndarray 7.2 分布随机函数 返回按照某些分布概率统计规则来产生的随机数 函数分布类型说明作用返回内容random.randn(d0, d1, ..., dn)标准正态分布d0表示第0轴元素个数依此类推至dn生成均值为0、方差为1的标准正态分布ndarrayrandom.uniform(low0.0, high1.0)[low, high]输出与size参数一致的数组生成[low, high]范围内的均匀分布随机数范围闭区间ndarray 7.3 代码示例 # 生成范围: [1, 61) 形状: 3 * 3(行列都为3) a np.random.randint(low1, high61, size3) print(a)[22 25 52] # 生成范围: [0, 1) 形状: 默认 d0 1, 即默认第1维度列数为1 b np.random.rand() print(b)0.5183023304438559# 生成范围: [0, 1) 形状: 1 * 3(列为3) -- d0 3, 第1维度列数为3 b2 np.random.rand(3) print(b2)[0.81005766 0.02184353 0.71997443]# 生成范围: [0, 1) 形状: 2 * 3(行为2列为3) b3 np.random.rand(2, 3) print(b3)[[0.4406283 0.09805051 0.38513889][0.08358786 0.63029173 0.02462558]]8 numpy 常用统计函数 8.1 函数统计 numpy 有很多统计函数用于查找数组中的最大最小元素… 函数语法功能说明关键参数说明sum(a, axisNone)计算数组a沿指定轴的元素和axis可为整数或元组如0按列1按行None全局计算average(a, axisNone, weightsNone)计算数组a沿指定轴的加权平均值weights权重数组需与a形状匹配std(a, axisNone)计算数组a沿指定轴的标准差默认计算总体标准差等效于ddof0var(a, axisNone)计算数组a沿指定轴的方差可通过ddof参数调整自由度如ddof1计算样本方差min(a) / max(a)返回数组a的最小值/最大值全局等价于np.min(a)/np.max(a)median(a)计算数组a的中位数全局对多维数组会先扁平化处理 8.2 axis怎么用 axis0垂直方向跨行操作axis1水平方向跨列操作axisNone全局操作忽略所有轴 操作axis0 (跨行)axis1 (跨列)axisNonenp.sum(aarr, axis?, dtypeint)[5, 7, 9][6, 15]21np.mean(aarr, axis?, dtypefloat)[2.5, 3.5, 4.5][2., 5.]3.5图示列方向求和行方向求和全部元素求和 代码演示 arr np.array([[1, 2, 3],[4, 5, 6]]) print(对所有的“行”求和:, np.sum(aarr, axis0)) print(对所有的“列”求和:, np.sum(aarr, axis1)) print(对“全部元素”求和:, np.sum(aarr, axisNone))对所有的“行”求和: [5 7 9] 对所有的“列”求和: [ 6 15] 对“全部元素”求和: 21print(对所有的“行”求平均值:,np.mean(aarr, axis0, dtypefloat)) print(对所有的“列”求平均值:,np.mean(aarr, axis1, dtypefloat)) print(对“全部元素”求平均值:,np.mean(aarr, axisNone, dtypefloat))对所有的“行”求平均值: [2.5 3.5 4.5] 对所有的“列”求平均值: [2. 5.] 对“全部元素”求平均值: 3.5三 pandas 注意 在pandas的函数中经常有axis的函数而axis0或axis1表示的含义容易让人混淆 axis 参数的方向 axis0 有时看起来是“行”有时又像是“列”。根本原因在于 axis 的定义是基于“操作的方向”而非“行或列本身” 官方定义axis0 是“沿行方向”操作跨行操作 axis0 表示操作是垂直方向从上到下即跨行row-wise操作。axis1 表示操作是水平方向从左到右即跨列column-wise操作。 1 pandas主要介绍 概括 pandaspythondataanalysis的缩写、numpy、matplotlib三者共同构成了Python数据分析的基础工具包称为“数据分析三剑客”pandas是在numpy的基础上实现的其核心数据结构与numpy的ndarray十分相似但是pandas与numpy的关系不是替代而是相互补充。 主要特色 科学计算 类比NumPy的通用函数和广播机制 数据读写 便捷的数据读写操作 分组聚合 类比SQL的join和groupby操作 数据透视 类比Excel的数据透视表操作 数据筛选 自带正则表达式的字符向量化操作 数据统计 简单的数据分析统计 数据可视化 集成matplotlib的基本可视化接口 2 pandas与numpy的区别 NumPy科学计算基础包专注多维数组高效运算 – 数值计算 NumPy主要用于数值计算继承了大量矩阵计算模块短阵运算、线性代数、生成随机数 Pandas数据分析工具包基于NumPy构建专注表格数据处理 – 数值处理 Pandas主要用于数据处理与分析(数据读写、数值计算、数据处理数据分析和数据可视化全套数据分析流程操作) 特性NumPy ndarrayPandas DataFrame/Series数据维度支持任意维度主要处理1D(Series)/2D(DataFrame)索引系统纯数字下标可自定义标签索引(行/列名)数据类型单数组内类型必须一致支持每列不同数据类型缺失值处理需用np.nan特殊值原生支持NaN处理机制 3 导入 pandas 库 import pandas as pd # 导入pandas库并使用pd作为别名4 pandas 的数据结构 4.1 区别 Series是一个 1 维 ** 数据结构它由index(索引)和value(值)组成。也就是它只有一行或一列**可以理解为Excel表格的一行或一列。DataFrame是一个 2 维 结构除了拥有index和value之外还拥有column(列)。可以理解为excel表格 数据结构维度访问series1维通过index索引访问dataframe2维通过index行索引和columns列索引访问 4.2 二者联系 DataFrame由多个Series组成无论是行还是列单独拆分出来都是一个Series 5 Series 数据类型 5.1 基本介绍 Series类型一维数据结构能够保存任何数据类型(整数、浮点数、字符串等)相当于excel表中的一行或一列。由索引和数据组成。 5.2 创建方式 pd.Series(dataNone, # 数据源必选indexNone, # 索引标签dtypeNone, # 强制数据类型nameNone, # Series名称copyFalse, # 是否拷贝数据fastpathFalse # 内部优化参数通常忽略 )pd.Serise(list/tuple) – 自动索引 import pandas as pd import numpy as nplis [1, 2, 3, 4, 5] # 列表 tup tuple(lis) # 元组print(pd.Series(lis)) # 将列表转换为Series0 1 1 2 2 3 3 4 4 5 dtype: int64print(pd.Series(tup)) # 将元组转换为Series0 1 1 2 2 3 3 4 4 5 dtype: int64解释输出结果 0 1 1 2 2 3 3 4 4 5 dtype: int64第一列为索引第二列为数值最后一行表示数据类型 pd.Serise([1, 2, 3], index[a, b, c]) – 自定义索引 因为 index 为第二个参数所以可以省略写index直接写[a, b, c]也是OK的 import pandas as pd import numpy as np lis [1, 2, 3, 4, 5] # 列表 # 创建方式2 指定索引 print(pd.Series(lis, index[a, b, c, d, e]))a 1 b 2 c 3 d 4 e 5 dtype: int64# 如果自定义索引的数量小于数值数量那么会报错 # 创建方式2 指定索引 print(pd.Series(lis, index[a, b, c])) # 报错5 DataFrame数据类型 5.1 基本介绍 DataFrame是一个表格型数据类型它含有一组有序的列每列可以是不同的值类型数值、字符串、布尔型**DataFrame既有行索引和有列索引它可以被看作由Series**组成的字典共用一个索引 行索引 \ 列索引书手机苹果012314562321 5.2 DataFrame的创建 pd.DataFrame(dataNone, # 数据源必需indexNone, # 行索引可选columnsNone, # 列名可选dtypeNone, # 强制数据类型可选copyFalse # 是否复制数据可选 )可以由如下类型创建 二维 ndarray 对象由1维ndarray、列表、元组、字典或Series构成的字典Series类型其他DataFrame类型 **DataFrame**具体实现 – 使用参数columns import pandas as pd# 创建二维列表2025年3-5月水果销售额数据 data [[2025年3月, 8500, 4800, 6200], # 苹果8500元香蕉4800元芒果6200元[2025年4月, 9200, 5200, 6800], # 苹果9200元香蕉5200元芒果6800元[2025年5月, 7800, 4500, 7500] # 苹果7800元香蕉4500元芒果7500元 ]# 创建DataFrame df pd.DataFrame(data,columns[日期, 苹果, 香蕉, 芒果],indexrange(1, 4) # 行索引1-3 )# 计算每月总销售额新增列 df[月总销售额] df[[苹果, 香蕉, 芒果]].sum(axis1)# 计算三个月总销售额单独输出 SUM df[月总销售额].sum()# 显示结果 print(2025年3-5月水果销售数据) print(df) print(f\n三个月总销售额{SUM}元) 打印结果 2025年3-5月水果销售数据日期 苹果 香蕉 芒果 月总销售额 1 2025年3月 8500 4800 6200 19500 2 2025年4月 9200 5200 6800 21200 3 2025年5月 7800 4500 7500 19800三个月总销售额60500元具体实现 – 使用「字典」创建 mport pandas as pd# 使用字典形式创建数据 data {日期: [2025年3月, 2025年4月, 2025年5月],苹果: [8500, 9200, 7800],香蕉: [4800, 5200, 4500],芒果: [6200, 6800, 7500] }# 创建DataFrame不再需要columns参数 df pd.DataFrame(data, indexrange(1, 4))# 计算总销售额新增列 df[月总销售额] df[苹果] df[香蕉] df[芒果]# 计算三个月总销售额单独输出 SUM df[月总销售额].sum()print(2025年3-5月水果销售数据) print(df) print(f\n三个月总销售额{SUM}元)打印结果 2025年3-5月水果销售数据日期 苹果 香蕉 芒果 月总销售额 1 2025年3月 8500 4800 6200 19500 2 2025年4月 9200 5200 6800 21200 3 2025年5月 7800 4500 7500 19800三个月总销售额60500元5.3 DataFrame的属性 属性不是方法两者完全不同 属性无括号方法有括号 属性说明实例结果示例indexDataFrame的行索引df.indexRangeIndex(start1, stop4, step1)columnsDataFrame的列索引df.columnsIndex([日期, 苹果, 香蕉, 芒果, 月总销售额], dtypeobject)values存储数据的numpy原生二维数组df.valuesarray([[2025年3月,8500,4800,6200,19500], [2025年4月,9200,5200,6800,21200], [2025年5月,7800,4500,7500,19800]], dtypeobject)dtypes各列数据类型df.dtypes日期:object苹果:int64香蕉:int64芒果:int64月总销售额:int64dtype: objectsize元素总数行×列df.size15 (3行×5列)shape维度形状行数,列数df.shape(3, 5)ndim维度数量df.ndim2 (始终为2维表格) print(\n行索引, df.index) print(列索引, df.columns) print(原生数组值, df.values) print(\n数据类型\n, df.dtypes) print(\n元素总数行数*列数, df.size) print(维度形状行数,列数, df.shape) print(维度数量, df.ndim)打印结果 行索引 RangeIndex(start1, stop4, step1) 列索引 Index([日期, 苹果, 香蕉, 芒果, 月总销售额], dtypeobject) 原生数组值 [[2025年3月 8500 4800 6200 19500][2025年4月 9200 5200 6800 21200][2025年5月 7800 4500 7500 19800]]数据类型日期 object 苹果 int64 香蕉 int64 芒果 int64 月总销售额 int64 dtype: object元素总数行数*列数 15 维度形状行数,列数 (3, 5) 维度数量 25.4 访问某行或某列 数据 import pandas as pd # 使用字典形式创建数据 data {日期: [2025年3月, 2025年4月, 2025年5月],苹果: [8500, 9200, 7800],香蕉: [4800, 5200, 4500],芒果: [6200, 6800, 7500] } df pd.DataFrame(data, index[a, b, c])日期 苹果 香蕉 芒果 a 2025年3月 8500 4800 6200 b 2025年4月 9200 5200 6800 c 2025年5月 7800 4500 7500访问列 单列访问1返回Series # 按列 # 单列返回Series S1 df[苹果] # 通过列名 print(苹果:\n, S1)打印结果 苹果:a 8500 b 9200 c 7800 Name: 苹果, dtype: int64单列访问2返回Series SS1 df.苹果 # 属性式访问仅限列名无空格时 如果列名是string不需要加引号直接写文字就行加上引号反而错了 print(苹果:\n, SS1)打印结果 苹果:a 8500 b 9200 c 7800 Name: 苹果, dtype: int64多列访问1返回DataFrame # 多列返回DataFrame SSS1 df[[苹果, 芒果]] # 列名列表 print([苹果, 芒果]\n, SS1)打印结果 [苹果, 芒果]a 8500 b 9200 c 7800 Name: 苹果, dtype: int64访问行 切记使用的是[]而不是() 单行访问1返回Series # 按行 # 单行返回Series S2 df.loc[a] # 通过行标签index值 print(a:\n,S2)打印结果 a:日期 2025年3月 苹果 8500 香蕉 4800 芒果 6200 Name: a, dtype: object单行访问2返回Series SS2 df.iloc[0] # 通过行位置从0开始 print(0:\n, SS2)打印结果 0:日期 2025年3月 苹果 8500 香蕉 4800 芒果 6200 Name: a, dtype: object多行访问1返回DataFrame # 多行(返回DataFrame) SSS2 df.loc[[a,b]] # 按标签选择多行 print([a,b]:\n, SSS2)打印结果 [a,b]:日期 苹果 香蕉 芒果 a 2025年3月 8500 4800 6200 b 2025年4月 9200 5200 6800多行访问2返回DataFrame SSSS2 df.iloc[0:2] # 按位置切片前两行-- 标签不能使用切片 print([0:2]:\n, SSSS2)打印结果 [0:2]:日期 苹果 香蕉 芒果 a 2025年3月 8500 4800 6200 b 2025年4月 9200 5200 6800行列组合访问方法 使用df.loc()方法1 # 同时指定行列 -- 使用 loc a df.loc[a, 苹果] # 1行的苹果列返回标量 print(a行苹果列: ,a) # 打印结果: a行苹果列: 8500使用df.loc()方法2 b df.loc[[a,c], [香蕉]] # a c行的香蕉列返回DataFrame print(a行与b行的香蕉列:\n,b)打印结果 a行与b行的香蕉列:香蕉 a 4800 c 4500使用df.iloc()方法1 # 同时指定行列 -- 使用 iloc # 切记使用Iloc的使用列名也要用索引而不是标签名 c df.iloc[0, 0] # 1行的苹果列返回标量 print(0行0列: ,a) # 打印结果: 0行0列: 8500使用df.iloc()方法2 d df.iloc[[0,2], 0] # 0 和 2行的香蕉列返回DataFrame print(0行和2行 * 0列:\n,b)打印结果 0行和2行 * 0列:香蕉 a 4800 c 4500使用df.iloc()方法3 e df.iloc[0:2, 2] # 0 到 2行的香蕉列返回DataFrame print(0行~2行 * 2列:\n,e)打印结果 0行~2行 * 2列:a 4800 b 5200 Name: 香蕉, dtype: int646 DataFrame与Series相互转换 DataFrame单取出来一行或一列时都是一个Series也可以将Series转换成DataFreme 6.1 DataFrame转Series 5.4中访问单行和单列的方式,就是将 DataFrame转换为Series S1 df[苹果] # 将苹果列转换为 Series SS1 df.苹果 # 将苹果列转换为 Series S2 df.loc[a]# 将a行转换为 Series SS2 df.iloc[0]# 将 0 行转换为 Series6.2 Series转DataFrame data [120, 230, 600] S pd.Series(data, index[1月,2月,3月], name月销售量) print(S)df pd.DataFrame(S) print(df) 打印结果 1月 120 2月 230 3月 600 Name: 月销售量, dtype: int64月销售量 1月 120 2月 230 3月 6007 简单运算 在Pandas中 axis1 表示按行计算横向计算即对每一行的多个列数据进行操作。 axis0默认值则表示按列计算纵向计算即对每一列的所有行数据进行操作。– 可省 Pandas底层使用NumPy的向量化计算避免Python循环开销且内存连续存储CPU缓存利用率更高。 # 数据 data {苹果: [85000, 92000, 78000],香蕉: [48000, 52000, 45000],芒果: [62000, 68000, 75000] } df pd.DataFrame(data, index[1月销售, 2月销售, 3月销售]) print(df)打印结果苹果 香蕉 芒果 1月销售 85000 48000 62000 2月销售 92000 52000 68000 3月销售 78000 45000 750007.1 行方向求和/平均值 – 横向求 # 新添加两列 # 在表格最后添加名为“总销量”的列并且值为苹果、香蕉、芒果列 -- 相加 df[月总销售量] df[苹果] df[香蕉] df[芒果] # 向量化操作无需循环 df[月总销售量(法2)] df[[苹果, 香蕉, 芒果]].sum(axis1) # axis1 意思是 按行计算横向计算0反之 # 计算每行平均值每月平均销量 df[月均销量] df[[苹果, 香蕉, 芒果]].mean(axis1) # axis1 意思是 按行计算横向计算0反之print(df)打印结果苹果 香蕉 芒果 月总销售量 月总销售量(法2) 月均销量 1月销售 85000 48000 62000 195000 195000 65000.000000 2月销售 92000 52000 68000 212000 212000 70666.666667 3月销售 78000 45000 75000 198000 198000 66000.0000007.2 列方向求和/平均值 – 纵向求 # 新添加两行 # 计算每列总和各水果总销量 df.loc[3个月总销售] df.iloc[0:3, 0:3].sum() # 前3行前3列最后一列的“月均销量”不算 -- 使用iloc[] df.loc[3个月均销售] df[[苹果, 香蕉, 芒果]].mean() # 使用标签print(df)打印结果苹果 香蕉 芒果 月总销售量 月总销售量(法2) 月均销量 1月销售 85000.0 48000.0 62000.0 195000.0 195000.0 65000.000000 2月销售 92000.0 52000.0 68000.0 212000.0 212000.0 70666.666667 3月销售 78000.0 45000.0 75000.0 198000.0 198000.0 66000.000000 3个月总销售 255000.0 145000.0 205000.0 NaN NaN NaN 3个月均销售 127500.0 72500.0 102500.0 NaN NaN NaN8 常用函数 基本函数描述rename()修改行索引/列索引insert()插入列drop()删除行或列head()返回DataFrame前n行tail()返回DataFrame后n行 8.1rename() 对行索引index及列索引columns重命名 df.rename(mapperNone, # 通用重命名方式字典/函数indexNone, # 指定行索引修改字典/函数columnsNone, # 指定列名修改字典/函数axisNone, # 替代index/columns0:行, 1:列inplaceFalse, # 是否原地修改levelNone # 多级索引的层级 )index: 行索引 index {X:X, X:X} 以字典或函数的形式columns : 列索引 inplace: 是否就地修改即是否在原数据生效 inplaceFalse默认 或 inplaseTrue 具体用法(修改行、列索引) 重命名苹果为 apple 香蕉为 banana df.rename(index {3个月总销售:仨月总销售}, columns{苹果:apple, 香蕉:banana}, inplaceTrue) print(df.index, df.columns, sep\n)打印结果 Index([1月销售, 2月销售, 3月销售, 仨月总销售, 3个月均销售], dtypeobject) Index([apple, banana, 芒果, 月总销售量, 月总销售量(法2), 月均销量], dtypeobject)8.2insert() 给表格插入一列插入时需要明确位置、列名、值 df.insert(loc, # 插入位置0-based索引表示第几列第一列为loc0column, # 新列名value, # 插入的数据int/数组/Seriesallow_duplicatesFalse # 是否允许列名重复默认为 False如果列名存在则报错设置为Ture表示允许列名重复 )具体用法 添加水杯列。并且给值 df.insert(0, 水杯, np.array([41, 23, 61, 412361, (412361)/3])) print(df)水杯 apple banana ... 月总销售量 月总销售量(法2) 月均销量 1月销售 41.000000 85000.0 48000.0 ... 195000.0 195000.0 65000.000000 2月销售 23.000000 92000.0 52000.0 ... 212000.0 212000.0 70666.666667 3月销售 61.000000 78000.0 45000.0 ... 198000.0 198000.0 66000.000000 仨月总销售 125.000000 255000.0 145000.0 ... NaN NaN NaN 3个月均销售 41.666667 127500.0 72500.0 ... NaN NaN NaN8.3drop() 删除指定的列或行 提示 如果写了 index标签相当于是labels,axis0二者写其一即可如果写了 index标签相当于是labels,axis1二者写其一即可 pd.DataFrame.drop(labelsNone, # 单个标签或标签列表axis0, # 0/index:行标签 | 1/columns:列标签indexNone, # 单个标签或标签列表 indexlabels等效于labels,axis0columnsNone, # 单个标签或标签列表 indexlabels等效于labels,axis1levelNone, # 多级索引的层级inplaceFalse, # 是否原地修改 还可以写Trueerrorsraise # ignore跳过不存在的标签 )具体用法 删除 ‘水杯’ 列 df.drop(columns水杯, inplaceTrue) # 方法1 df.drop(水杯, axis1, inplaceTrue) # 方法2 print(df)打印结果apple banana 芒果 月总销售量 月总销售量(法2) 月均销量 1月销售 85000.0 48000.0 62000.0 195000.0 195000.0 65000.000000 2月销售 92000.0 52000.0 68000.0 212000.0 212000.0 70666.666667 3月销售 78000.0 45000.0 75000.0 198000.0 198000.0 66000.000000 仨月总销售 255000.0 145000.0 205000.0 NaN NaN NaN 3个月均销售 127500.0 72500.0 102500.0 NaN NaN NaN8.4 head() 返回前n行 pd.DataFrame.head(n5 # 显示的行数默认为5 )具体用法 打印前2行 print(df.head(2))打印结果apple banana 芒果 月总销售量 月总销售量(法2) 月均销量 1月销售 85000.0 48000.0 62000.0 195000.0 195000.0 65000.000000 2月销售 92000.0 52000.0 68000.0 212000.0 212000.0 70666.6666678.5tail() 返回其后n行 pd.DataFrame.tail(n5 # 显示的行数默认为5 )具体用法 打印后2行 print(df.tail(2))打印结果apple banana 芒果 月总销售量 月总销售量(法2) 月均销量 仨月总销售 255000.0 145000.0 205000.0 NaN NaN NaN 3个月均销售 127500.0 72500.0 102500.0 NaN NaN NaN四 pandas数据读写 门店销售数据-练手.xlsx的数据如下 年月门店销售收入销售成本销售毛利2025Jan门店01478803.28295586.23183217.052025Jan门店02442108.16330633.55111474.612025Jan门店03367875.06190555.04177320.022025Jan门店04174356.94138562.7235794.222025Jan门店05182158.68113867.9068290.782025Jan门店06413329.60241064.13172265.472025Jan门店07343982.98233408.43110574.552025Jan门店08352803.32179906.26172897.062025Jan门店09228984.02150709.1378274.89…… 该表格中的数据还有很多显示不开就展示一部分 Pandas数据分析需要处理各种类型的数据读/写数据也是Pandas的重要功能Pandas提供了多种接口函数用于支持多种类型数据读取(如CSV、Excel、SQL等) Pandas可以将读取到的表格型数据转换为DataFrame数据然后通过操作DataFrame进行数据分析、数据预处理及行列操作。 该文主要记录的是Pandas最常用的Excel表格的读写 pandas 需要openpyxl库来读取 .xlsx 格式的 Excel 文件所以一定要安装这个库之后再读取Excel文件否则报错 # 终端输入 pip install openpyxl1 Excel 文件读取 1.1 函数语法 pd.read_excel(# 必选参数 io, # 【常用】文件路径如data.xlsx或文件对象# 「核心控制参数」 sheet_name0, # 【常用】工作表选择0首个表Sheet1表名None全读header0, # 【常用】表头行0首行None无表头[0,1]多行表头namesNone, # 【常用】自定义列名如[姓名,年龄]index_colNone, # 【常用】索引列0第1列ID列名[0,1]多级索引usecolsNone, # 【常用】读取列A:C列范围[0,2]列位置lambda x: 价 in x筛选# 「数据类型处理」 dtypeNone, # 【常用】列数据类型如{ID: str, 价格: float}parse_datesFalse, # 【常用】日期解析True自动[下单时间]指定列convertersNone, # 列转换函数如{电话: lambda x: str(x)}# 「数据清理」na_valuesNone, # 【常用】空值标记如[NA, NULL, ]keep_default_naTrue, # 是否保留默认空值NaN/None等skiprowsNone, # 【常用】跳过行5前5行[0,2]第1,3行nrowsNone, # 读取行数如100仅读前100行# 「性能相关」 engineNone, # 引擎openpyxlxlsxxlrdxlsmemory_mapFalse, # 内存映射优化大文件# 其他参数按需使用skipfooter0, # 跳过末尾行decimal., # 小数点符号欧洲数据可改为,**kwds )参数解释实例io文件路径rD:\数据资料\data.xlsx (r写在字符串前面防止字符转义)sheet_name0导入的sheet页1.sheet_name0:默认值即导入第一个页签sheet序号从0开始;2.sheet_name表名’:直接输入目标sheet的名称中英文皆可;3.sheet_nameSheetN:代表第N个sheetS要大写;4.sheet_nameNone:即导入所有页签返回字典类型的数据。header0用哪一行做列名1.header0,默认值表格第一行作为列名;2.header[0,1]表示前两行作为列名。names自定义列名1.names[销售量,销售单价,销售总额]2.一般适用于Excel缺少列名或者需要重新定义列名的情况names的长度必须和Excel列长度一致否则会报错index_col设置行索引1.index_colNone:默认数据不带行索引自动分配从0开始的索引号;2.index_col0:以第一列作为行索引;3.index_col[0,1]表示将前两列作为多重索引usecols需要读取哪些列1.usecolsNone:默认取所有列;2.usecols[0,2,3]:以列号代表要取的列;3.usecols[年,月]:以列名代表要取的列converters强制规定列的数据类型converters{时间:str,销售单价:float}:将’时间’列数据类型强制规定为字符串类型,销售单价’列强制规定为浮点型。 1.2 具体实现 打印前5行数据 打印前5行数据 import pandas as pd file_path r门店销售数据-练手.xlsx # 该文件已在根目录# 打开Excel文件并且将“年、月、门店”这三列的数据强制转换为string类型 df pd.read_excel(file_path, sheet_name0, converters{年:str, 月:str, 门店:str}) print(df.head(5))打印结果年 月 门店 销售收入 销售成本 销售毛利 0 2025 Jan 门店01 478803.28 295586.23 183217.05 1 2025 Jan 门店02 442108.16 330633.55 111474.61 2 2025 Jan 门店03 367875.06 190555.04 177320.02 3 2025 Jan 门店04 174356.94 138562.72 35794.22 4 2025 Jan 门店05 182158.68 113867.90 68290.78打印前5行数据设置行索引为‘门店’列中的数据 打印前5行以‘门店’列为表格的行索引 下面可以看出来门店这一列到了最左侧门店这一列是行索引 df2 pd.read_excel(file_path, sheet_name0, converters{年:str, 月:str, 门店:str}, index_col门店,) print(df2.head(5))打印结果年 月 销售收入 销售成本 销售毛利 门店 门店01 2025 Jan 478803.28 295586.23 183217.05 门店02 2025 Jan 442108.16 330633.55 111474.61 门店03 2025 Jan 367875.06 190555.04 177320.02 门店04 2025 Jan 174356.94 138562.72 35794.22 门店05 2025 Jan 182158.68 113867.90 68290.782 Excel文件写入 – pd.to_excel(...) 将 df 数据写入到 Excel 文件 若路径文件不存在会自动创建若存在则覆盖原内容。 2.1 函数语法 如果找不到这个表格则新建一个。 df.to_excel(# 「必选参数」excel_writer, # 【常用】文件路径或ExcelWriter对象如output.xlsx# 「核心控制参数」 sheet_nameSheet1, # 【常用】工作表名称默认Sheet1na_rep, # 【常用】空值填充符号默认空字符串float_formatNone, # 浮点数格式如%.2f保留两位小数columnsNone, # 【常用】导出的列默认所有列headerTrue, # 【常用】是否写入列名True/False/[列名列表]indexTrue, # 【常用】是否写入行索引True/Falseindex_labelNone, # 索引列标题字符串或列表用于多级索引startrow0, # 起始行位置默认0startcol0, # 起始列位置默认0# 「引擎与格式」 engineNone, # 引擎openpyxl或xlsxwritermerge_cellsTrue, # 是否合并单元格适用于多级索引inf_repinf, # 无穷大值的表示方式freeze_panesNone, # 冻结窗格位置如(1,1)冻结首行首列# 存储控制storage_optionsNone, # 云存储参数如S3路径**kwargs # 其他引擎特定参数 )参数解释实例excel_write文件路径rD:\数据资料\data2.xlsx r写在字符串前面防止字符转义sheet_name导出的excel表名1. 默认sheet名是Sheet12. sheet_name表名index是否写入索引indexTrue写入索引indexFalse不写入索引 2.2 具体实现 将处理好的DataFrame导出为新Excel文件要求如下 文件命名为“门店销售表2”表名为“毛利率” import pandas as pdfile_path r门店销售数据-练手.xlsx # 该文件已在根目录 # 打开Excel文件并且将“年、月、门店”这三列的数据强制转换为string类型并且以门店为行索引 df2 pd.read_excel(file_path, sheet_name0, converters{年:str, 月:str, 门店:str}, index_col门店) print(df2.head(5))# 将df2中的数据存入新表“门店销售表2.xlsx”中去 df2.to_excel(门店销售表2.xlsx, sheet_name毛利率)门店销售表2.xlsx表格如下 门店年月销售收入销售成本销售毛利门店012025Jan478803.28295586.23183217.05门店022025Jan442108.16330633.55111474.61门店032025Jan367875.06190555.04177320.02门店042025Jan174356.94138562.7235794.22门店052025Jan182158.68113867.968290.78门店062025Jan413329.6241064.13172265.47门店072025Jan343982.98233408.43110574.55……还有很多写不开了 3 Excel文件写入 – df.ExcelWriter(...) 将 df 数据写入到 Excel 文件 若路径文件不存在会自动创建若存在则覆盖原内容 3.1 函数语法 pd.ExcelWriter(# 「必选参数」path, # 【必须】文件路径如output.xlsxengineNone, # 引擎默认自动选择可选openpyxl/xlsxwriterdate_formatNone, # 日期格式如YYYY-MM-DDdatetime_formatNone, # 时间格式如HH:MM:SSmodew, # 【常用】写入模式w覆盖/a追加if_sheet_existsNone, # 【常用】【追加模式】同名表处理error报错/replace覆盖/new新建storage_optionsNone, # 云存储参数如S3路径**kwargs # 其他引擎参数 )3.2 具体实现 将df数据写入“门店销售表2.xlsx”中的新表格”sheet2“中 方法1 手动保存关闭 # pd.Excel() 与 df.to_excel() 结合使用 # 以 a 追加的形式打开门店销售表2.xlsx writer pd.ExcelWriter(门店销售表2.xlsx, modea) # 将 df 写入到 门店销售表2.xlsx 的 sheet2 中 df.to_excel(writer, sheet_namesheet2) writer._save() # 保存 writer.close() # 关闭方法2 自动保存关闭 with pd.ExcelWriter(门店销售表2.xlsx, modea):df.to_excel(writer, sheet_namesheet2)3 toexcel 与 ExcelWriter 的区别与联系 3.1 区别 对比项df.to_excel()pd.ExcelWriter功能快速写入单个Sheet高级控制多Sheet/追加/格式多Sheet支持只能写1个Sheet可写入多个Sheet文件模式仅覆盖支持追加 (modea/w)代码复杂度单行代码需配合 with 语句适用场景简单导出单个表复杂需求保留原数据、多表、格式 一句话总结 简单导出用 to_excel复杂操作多Sheet/追加用 ExcelWriter。 3.2 联系 简单需求用 df.to_excel()复杂需求追加/多Sheet/格式才需配合 ExcelWriter df.to_excel() 和 pd.ExcelWriter 的关系说明 独立使用 df.to_excel(文件.xlsx)直接覆盖写入默认适合简单导出单个表。pd.ExcelWriter(文件.xlsx)仅创建写入器需后续操作如结合to_excel()才能写入数据。 配合使用 当需要以下功能时才需结合两者 追加数据到已有文件modea。写入多个Sheet到同一文件。精细控制格式如单元格样式、公式。 with pd.ExcelWriter(文件.xlsx, modea) as writer:df1.to_excel(writer, sheet_nameSheet1) # 追加写入df2.to_excel(writer, sheet_nameSheet2) # 再写一个Sheet4 CSV 文件写入与读取 4.1 函数语法 pd.read_csv pd.read_csv(# 「必选参数」filepath_or_buffer, # 【必须】文件路径/URL/文件对象如data.csv# 「核心控制参数」sep,, # 【常用】分隔符默认逗号可设为\t等headerinfer, # 【常用】列名行默认首行None为无列名namesNone, # 自定义列名列表如[列1, 列2]index_colNone, # 【常用】指定索引列列名或位置dtypeNone, # 列数据类型如{列1: float64}parse_datesFalse, # 【常用】是否解析日期列skiprowsNone, # 跳过指定行数如跳过前3行填3na_valuesNone, # 指定缺失值标识如[NA, NULL]# 「读取控制」encodingNone, # 【常用】文件编码如utf-8/gbkengineNone, # 引擎c/python/pyarrowconvertersNone, # 列自定义转换函数true_valuesNone, # 强制视为True的值false_valuesNone, # 强制视为False的值# 「存储优化」memory_mapFalse, # 内存映射读取大文件storage_optionsNone, # 云存储参数如S3路径**kwargs # 其他参数 )参数解释实例filepath or buffer文件路径或网址rD:\数据资源\data1.csvsep指定分隔符默认’号header指定行数来作为列名; 若文件中没有列名则默认为0dtype每列数据的数据类型{a:np.float64, b:np.int32}encoding指定字符集类型通常指为’utf-8’encoding指定文件编码如utf-8 / gbk pd.to_csv df.to_csv(# 「必选参数」path_or_buf, # 【必须】文件路径/URL/文件对象如rD:\数据资源\output.csv# 「核心控制参数」sep,, # 【常用】分隔符默认逗号可设为\t等na_rep, # 缺失值填充符号默认空字符串float_formatNone, # 浮点数格式如%.2f保留两位小数columnsNone, # 指定导出的列默认所有列headerTrue, # 【常用】是否写入列名True/False/[列名列表]indexTrue, # 【常用】是否写入行索引index_labelNone, # 索引列标题字符串或列表# 「编码与格式」encodingNone, # 【常用】字符集类型如utf-8图片中明确提及date_formatNone, # 日期格式如%Y-%m-%d# 「写入控制」modew, # 写入模式w覆盖/a追加compressioninfer, # 压缩格式如gzipquotingNone, # 引用规则0-3对应csv.QUOTE_*常量quotechar, # 引用符号line_terminatorNone, # 行结束符# 「存储优化」chunksizeNone, # 分块写入大小storage_optionsNone, # 云存储参数如S3路径**kwargs # 其他引擎参数 )参数解释实例filepath or buffer文件路径或网址rD:\数据资源\data1.csvsep指定分隔符默认’号header指定行数来作为列名; 若文件中没有列名则默认为0dtype每列数据的数据类型{a:np.float64, b:np.int32}encoding指定字符集类型通常指为’utf-8’ 4.2 具体实现 1. 写入CSV文件df.to_csv import pandas as pd import numpy as np# 创建DataFrame自动推断类型a-float64, b-int64, text-object data {a: [1.1, 2.2, 3.3],b: [4, 5, 6],text: [测试, data, csv] } df pd.DataFrame(data)# 正确写入CSV去掉dtype df.to_csv(r测试.csv,sep,,headerTrue,indexFalse,encodingutf-8 )2. 读取CSV文件pd.read_csv # 正确读取CSV仅对数值列指定dtype df_read pd.read_csv(r测试.csv,sep,,header0,dtype{a: np.float64, b: np.int32}, # 确保与实际数据保持一致encodingutf-8 )print(df_read)打印结果a b text 0 1.1 4 测试 1 2.2 5 data 2 3.3 6 csv5 其他格式文件读写 数据源类型读取函数写入函数Textread_csv()to_csv()CSVread_csv()to_csv()Clipboardread_clipboard()to_clipboard()JSONread_json()to_json()HTMLread_html()to_html()MS Excelread_excel()to_excel()HDFSread_hdf()to_hdf()Msgpackread_msgpack()to_msgpack()Python Pickleread_pickle()to_pickle()Stataread_stata()to_stata()SASread_sas()to_sas()SQLread_sql()to_sql() 五 pandas 数据筛选 1 基本介绍 从各类数据源导入的数据DataFrame的数据量会有冗余 Pandas通过直接筛选、条件筛选、索引器筛选选择DataFrame中分析所需的数据。 直接筛选:直接筛选行列代码难度最小。条件筛选:筛选满足某些条件的行如:销售收入高于100万的销售渠道索引器筛选:通过DataFrame索引灵活的筛选数据灵活性最高。 2 直接筛选 2.1 介绍 返回的都是 DataFrame 使用df[]直接筛选根据中括号内容不同可筛选以下数据 选取一列 df[列名]选取多列 df[[列名1, 列名2]]选取连续的行 df[0 : 3] # 选取0~2行的数据2.2 实现 import numpy as np import pandas as pd# 打开Excel文件并且将“年、月、门店”这三列的数据强制转换为string类型 df pd.read_excel(门店销售数据-练手.xlsx, sheet_name0) print(df.head(5)) print(df[年].head(5)) # 打印列名为年的前5行 print(df[[门店, 销售收入]].head(5)) # 打印列名为门店销售收入的前5行 print(df[3:6]) # 打印行索引3到行索引5的数据索引左闭右开 打印结果年 月 门店 销售收入 销售成本 销售毛利 0 2025 Jan 门店01 478803.28 295586.23 183217.05 1 2025 Jan 门店02 442108.16 330633.55 111474.61 2 2025 Jan 门店03 367875.06 190555.04 177320.02 3 2025 Jan 门店04 174356.94 138562.72 35794.22 4 2025 Jan 门店05 182158.68 113867.90 68290.78 0 2025 1 2025 2 2025 3 2025 4 2025 Name: 年, dtype: int64门店 销售收入 0 门店01 478803.28 1 门店02 442108.16 2 门店03 367875.06 3 门店04 174356.94 4 门店05 182158.68年 月 门店 销售收入 销售成本 销售毛利 3 2025 Jan 门店04 174356.94 138562.72 35794.22 4 2025 Jan 门店05 182158.68 113867.90 68290.78 5 2025 Jan 门店06 413329.60 241064.13 172265.473 条件筛选 2.1 介绍 条件筛选也称为带条件判断的数据筛选可以通过条件在数据中筛选出条件为True的数据常见的形式有 在某列中选取满足条件的行 df[df[某列] 条件]在多列中选取满足条件的行 df[(df[列1] 条件) (df[列2] 条件)]2.2 实现 print(df[df[门店] 门店01]) print(df[(df[销售收入] 500000) (df[销售成本] 500000)])打印结果年 月 门店 销售收入 销售成本 销售毛利 0 2025 Jan 门店01 478803.28 295586.23 183217.05 40 2025 Feb 门店01 475701.16 293574.20 182126.96 80 2025 Mar 门店01 472599.04 291562.17 181036.87 120 2025 Apr 门店01 480996.59 296207.34 184789.25 160 2025 May 门店01 477894.47 294195.31 183699.16 200 2025 Jun 门店01 474792.35 292183.28 182609.07 240 2025 Jul 门店01 483189.90 296828.45 186361.45 280 2025 Aug 门店01 480087.78 294816.42 185271.36 320 2025 Sep 门店01 476985.66 292804.39 184181.27 360 2025 Oct 门店01 485383.21 297449.56 187933.65 400 2025 Nov 门店01 482281.09 295437.53 186843.56 440 2025 Dec 门店01 479178.97 293425.50 185753.47年 月 门店 销售收入 销售成本 销售毛利 145 2025 Apr 门店26 501048.17 319842.42 181205.75 265 2025 Jul 门店26 503241.48 320463.53 182777.95 305 2025 Aug 门店26 500139.36 318451.50 181687.86 385 2025 Oct 门店26 505434.79 321084.64 184350.15 425 2025 Nov 门店26 502332.67 319072.61 183260.064 索引器筛选 - loc索引器 4.1 介绍 通过DataFrame索引灵活的筛选数据灵活性最高。 主要分为: loc索引: 自定义索引iloc索引: 原始索引 4.2 loc 索引 (location的缩写) loc()中既可以写 行索引值原始索引也可以用于 行名自定义索引 loc索引器默认使用自定义索引如数据中没有自定义索引使用原始索引 且无论使用自定义索引还是原始索引在loc中使用的切片全是闭区间 根据index和column进行选取先index后column中间使用,隔开。 具体用法 [行1,行2], 行1:行2, df[列]条件 可以和[列1,列2], 列1:列2, [列1,列2]] 任意组合 筛选类型语法示例说明单行筛选df.loc[行]筛选指定单行行列组合筛选df.loc[[行1,行2], [列1,列2]]筛选指定的多行多列组合连续行列筛选df.loc[行1:行2, 列1:列2]筛选连续范围内的行和列条件筛选指定列df.loc[df[列]条件, [列1,列2]]筛选满足条件的行并只保留指定列 实操 print(df.loc[2]) # 1获取行索引为2的数据返回Series对象打印结果 年 2025 月 Jan 门店 门店03 销售收入 367875.06 销售成本 190555.04 销售毛利 177320.02 Name: 2, dtype: objectprint(df.loc[[0, 3]]) # 2获取行索引为0和3的数据返回DataFrame打印结果年 月 门店 销售收入 销售成本 销售毛利 0 2025 Jan 门店01 478803.28 295586.23 183217.05 3 2025 Jan 门店04 174356.94 138562.72 35794.22print(df.loc[[0, 3], [年, 门店, 销售收入]]) # 3获取行索引为0和3的行且只显示年、门店、销售收入三列打印结果年 门店 销售收入 0 2025 门店01 478803.28 3 2025 门店04 174356.94print(df.loc[0:3, [年, 门店, 销售收入]]) # 4获取行索引0到3闭区间且只显示年、门店、销售收入三列打印结果年 门店 销售收入 0 2025 门店01 478803.28 1 2025 门店02 442108.16 2 2025 门店03 367875.06 3 2025 门店04 174356.94print(df.loc[0:3, 年:销售收入]) # 5获取行索引0到3闭区间且显示从年到销售收入的所有连续列打印结果年 月 门店 销售收入 0 2025 Jan 门店01 478803.28 1 2025 Jan 门店02 442108.16 2 2025 Jan 门店03 367875.06 3 2025 Jan 门店04 174356.94print(df.loc[df[门店]门店01, 年:销售毛利]) # 6条件筛选门店为门店01的所有行并显示从年到销售毛利的所有列打印结果年 月 门店 销售收入 销售成本 销售毛利 0 2025 Jan 门店01 478803.28 295586.23 183217.05 40 2025 Feb 门店01 475701.16 293574.20 182126.96 80 2025 Mar 门店01 472599.04 291562.17 181036.87 120 2025 Apr 门店01 480996.59 296207.34 184789.25 160 2025 May 门店01 477894.47 294195.31 183699.16 200 2025 Jun 门店01 474792.35 292183.28 182609.07 240 2025 Jul 门店01 483189.90 296828.45 186361.45 280 2025 Aug 门店01 480087.78 294816.42 185271.36 320 2025 Sep 门店01 476985.66 292804.39 184181.27 360 2025 Oct 门店01 485383.21 297449.56 187933.65 400 2025 Nov 门店01 482281.09 295437.53 186843.56 440 2025 Dec 门店01 479178.97 293425.50 185753.474.3 loc 索引 (integer location的缩写) iloc与loc的使用几乎相同 不同的两点 不同是iloc索引器只能使用原始索引不能使用自定义索引。iloc() 索引器原始索引初值从0开始切片前闭后开 六 pandas 数据特征分析 处理数据时值读取和筛选数据往往是不够的。 还需要对读取和筛选处理啊的数据进行统计 1 简单统计分析 1.1 基本介绍 函数描述函数描述sum()所有值求和max()所有值中的最大值count()非空数据数量abs()绝对值mean()所有值的平均值prod()数组元素的乘积median()所有值的中位数cumsum()累计总和std()所有值的标准差cumprod()累计乘积min()所有值的最小值describe()统计信息摘要 以上函数除describe()函数外均有一个axis参数 axis0时横向计算 (按列统计)– 默认axis1时纵向计算 (按行统计) 1.3 示例 import pandas as pd import numpy as np# 读取数据假设列名为年,月,门店,销售收入,销售成本,销售毛利 df pd.read_excel(门店销售数据-练手.xlsx, sheet_name0)# 1 基本统计函数axis0 默认列方向即横向计算 print( 列方向计算即横向计算各门店横向对比) print(f总销售收入: {df[销售收入].sum():.2f}) # 所有门店销售收入总和 print(f平均销售成本: {df[销售成本].mean():.2f}) # 所有门店成本平均值 print(f销售毛利的中位数: {df[销售毛利].median():.2f}) # 所有门店毛利中位数 print(f销售收入标准差: {df[销售收入].std():.2f}) # 销售收入离散程度 print(f销售成本最低的门店: {df[销售成本].min():.2f}) # 最低成本值# 2 行方向计算axis1 按门店纵向计算即纵向计算 print(\n 行方向计算即纵向计算单门店纵向分析) df[利润率] df[销售毛利] / df[销售收入] # 新增利润率列 print(df[[门店, 利润率]].head(3)) # 显示前3门店利润率# 3 累计计算 -- axis0默认的横向计算 df[累计销售收入] df[销售收入].cumsum() # 累计销售收入 print(\n累计销售前3名) print(df[[门店, 累计销售收入]].head(3))# 4 统计信息摘要describe自动忽略非数值列 print(\n 全表统计摘要 ) print(df.describe())打印结果 E:\dev\python\python3.13.2\python.exe E:\code\爬虫\爬虫练习\pandas数据特征分析.py 列方向计算即横向计算各门店横向对比 总销售收入: 143920482.12 平均销售成本: 191512.75 销售毛利的中位数: 100302.29 销售收入标准差: 103919.78 销售成本最低的门店: 67211.50 行方向计算即纵向计算单门店纵向分析门店 利润率 0 门店01 0.382656 1 门店02 0.252143 2 门店03 0.482012累计销售前3名门店 累计销售收入 0 门店01 478803.28 1 门店02 920911.44 2 门店03 1288786.50 全表统计摘要 年 销售收入 ... 利润率 累计销售收入 count 480.0 480.000000 ... 480.000000 4.800000e02 mean 2025.0 299834.337750 ... 0.359177 7.226684e07 std 0.0 103919.782544 ... 0.078693 4.159336e07 min 2025.0 100024.530000 ... 0.199902 4.788033e05 25% 2025.0 214257.017500 ... 0.318648 3.594607e07 50% 2025.0 286253.440000 ... 0.332734 7.167544e07 75% 2025.0 378582.420000 ... 0.403608 1.076669e08 max 2025.0 505434.790000 ... 0.581908 1.439205e08[8 rows x 6 columns]进程已结束退出代码为 0 2 数据排序 2.1 基本介绍 数据的排序是比较常用的操作Pandas 提供的排序分为两种 对索引进行排序sort_index()进行索引的排序。 通过axis参数指定对行索引排序还是对列索引排序默认为 0表示对行索引排序设置为 1 表示对列索引进行排序ascending参数指定升序还是降序默认为True表示升序设置为False表示降序。 对值进行排序sort_values()进行值的排序。 相比sort_index()方法多了一个by参数按字符串或者列表来指定要排序的行或者列名其余基本一致。 2.2 函数的常用参数 by参数在DataFrame中使用Series不需要 # 按索引排序 sort_index(axis0, # 0表示按行索引排序1表示按列索引排序ascendingTrue, # True升序False降序inplaceFalse, # 是否原地修改False返回新对象True直接修改原对象na_positionlast # 缺失值位置last放最后first放最前 )# 按值排序 sort_values(bycolumn_name # 按指定列名排序当axis0时axis0, # 0表示按行排序1表示按列排序ascendingTrue, # True升序False降序inplaceFalse, # 是否原地修改kindquicksort, # 排序算法quicksort快速排序mergesort归并排序等na_positionlast, # 缺失值位置 )2.3 示例1 – sort_values 题目筛选销售收入“前3”名的数据 代码 # 5 筛选销售收入”前3“名的数据 print(\n 筛选销售收入”前3“名的数据 ) # 按照列‘销售收入’按行降序不修改原值前3行 print(df.sort_values(销售收入, axis0, ascendingFalse, inplaceFalse).head(3))打印结果 筛选销售收入”前3“名的数据 年 月 门店 销售收入 销售成本 销售毛利 利润率 累计销售收入 385 2025 Oct 门店26 505434.79 321084.64 184350.15 0.364736 1.161108e08 265 2025 Jul 门店26 503241.48 320463.53 182777.95 0.363201 7.994210e07 425 2025 Nov 门店26 502332.67 319072.61 183260.06 0.364818 1.282792e082.3 示例1 – sort_values 题目 计算销售毛利前5的数据如销售毛利相同根据销售收入升序排序。 代码 # 6 计算销售毛利前5的数据(如销售毛利相同根据销售收入升序排序) print(\n 计算销售毛利前5的数据如销售毛利相同根据销售收入升序排序 ) # 按照列[销售毛利, 销售收入]按行按[降序, 升序]不修改原值前3行 print(df.sort_values([销售毛利,销售收入], ascending[False, True], inplaceFalse).head())打印结果 计算销售毛利前5的数据如销售毛利相同根据销售收入升序排序 年 月 门店 销售收入 销售成本 销售毛利 利润率 累计销售收入 376 2025 Oct 门店17 438155.62 225334.80 212820.82 0.485720 1.133156e08 416 2025 Nov 门店17 435053.50 223322.77 211730.73 0.486677 1.255119e08 256 2025 Jul 门店17 435962.31 224713.69 211248.62 0.484557 7.716657e07 456 2025 Dec 门店17 431951.38 221310.74 210640.64 0.487649 1.375841e08 296 2025 Aug 门店17 432860.19 222701.66 210158.53 0.485511 8.927516e073 累计函数 3.1 基本介绍 对于Pandas的dataframe的某一列数据想要获取该列的数值从大到小依次的累积占比(如累计加和累计乘积累计最大值累计最小值)时会用到累计函数 作用就是逐行累加/乘/最大/最小 函数作用cumsum计算前 1/2/3/…/n 个数的和cumprod计算前 1/2/3/…/n 个数的积cummax计算前 1/2/3/…/n 个数的最大值cummin计算前 1/2/3/…/n 个数的最小值 3.2 示例 题目 筛选出各家门店一月份(Jan)的数据根据销售收入降序排列使用cumsum计算累计销售收入打印前5行 累计销售收入什么意思 计算的是前n家门店的销售总额比如门店1只有门店1的销售额门店2 是门店1加门店2的销售额 依次类推 代码 # 筛选出各家门店一月份(Jan)的数据根据“销售收入”降序排列 # 使用cumsum计算累计销售收入 # 打印前5行 print(\n 筛选出各家门店一月份(Jan)的数据根据销售收入降序排列 \n 使用cumsum计算累计销售收入打印前5行 ) data df.loc[df[月]Jan].sort_values(销售收入, ascendingFalse, inplaceFalse) data[累计销售收入] data[销售收入].cumsum() print(data.head())筛选出各家门店一月份(Jan)的数据根据销售收入降序排列 使用cumsum计算累计销售收入打印前5行 年 月 门店 销售收入 销售成本 销售毛利 利润率 累计销售收入 25 2025 Jan 门店26 498854.86 319221.31 179633.55 0.360092 498854.86 0 2025 Jan 门店01 478803.28 295586.23 183217.05 0.382656 977658.14 20 2025 Jan 门店21 448175.59 305059.40 143116.19 0.319331 1425833.73 1 2025 Jan 门店02 442108.16 330633.55 111474.61 0.252143 1867941.89 33 2025 Jan 门店34 440549.17 299973.43 140575.74 0.319092 2308491.06七 数据合并 1 基本了解 在实际处理数据业务需求中经常会遇到将多个表连接起来再进行数据处理的事情类似于SQL查询。数据合并是数据处理过程中的必须要做的步骤 经常使用的数据合并方法有两种 merge()函数只能用于两个DataFrame对象之间列方向(横向)进行内联或外联合并操作默认取交集concat()函数可用于两个或多个DataFrame对象之间行/列方向进行内联或外联合并操作默认对行沿y轴取并集 列连接连接是【横向连接】 行连接是【纵向连接】 2 merge() 函数 2.1 介绍 作用及使用 具有表连接功能可以根据一个或多个键(列值)将不同DataFrame连接起来两个DataFrame存在相同的键(列值)根据键(列值)整合到一张表里面。 函数语法 pandas.merge(left, # 【常用】左侧DataFrame对象right, # 【常用】右侧DataFrame对象howinner, # 【常用】合并方式inner(默认), left, right, outer, crossonNone, # 【常用】用于连接的列名两个表共有的列名left_onNone, # 【常用】左侧表中用作连接键的列right_onNone, # 【常用】右侧表中用作连接键的列left_indexFalse, # 是否使用左侧表的索引作为连接键right_indexFalse, # 是否使用右侧表的索引作为连接键sortFalse, # 是否按连接键排序结果suffixes(_x, _y), # 【常用】重复列名的后缀默认_x和_ycopyTrue, # 是否复制数据默认TrueindicatorFalse, # 是否添加_merge列显示合并来源validateNone # 检查合并类型one_to_one, one_to_many, many_to_one, many_to_many )how inner内连接默认只保留键匹配的行 – 取交集left左连接保留左表所有行 – 以左表为主right右连接保留右表所有行 – 以右表为主outer全外连接保留所有行 – 取并集cross笛卡尔积连接 on/left_on/right_on on当左右两个表的连接键列名完全相同时使用left_on和right_on当左右两个表的连接键列名不同时使用要么只用用on要么就用left_on和right_on两个不要混用 suffixes 当两个DF有相同非连接列时自动添加后缀区分 参数说明left、right两个不同的 DataFramehow连接方式有 inner、outer、left、right默认为 inner 内连接on用于连接的列索引名称左右两个 DataFrame 中必须同时存在如果没有指定且 left_index 和 right_index 为 False则以两个 DataFrame 列名交集作为连接键left_on左侧 DataFrame 中用于连接键的列名该参数在左右列名不同但代表的含义相同时非常有用right_on右侧 DataFrame 中用于连接键的列名该参数在左右列名不同但代表的含义相同时非常有用left_index默认 False设置为 True 代表使用左侧 DataFrame 中的行索引作为连接键right_index默认 False设置为 True 代表使用右侧 DataFrame 中的行索引作为连接键sort默认为 False是否将合并的数据进行排序设置为 False 可以提高性能suffixes字符串值组成的元组两个表存在除主键之外的相同列名时在列名后面附加的后缀名称用以区分数据来源于哪个表默认为 (‘_x’,‘_y’) 2.2 连接键时参数的使用冲突 以下是 pandas.merge() 中不能混用的参数组合总结 互斥关系 1. 连接键指定冲突 on left_on/right_on – 冲突 用 on列名相同时不能同时指定 left_on/right_on用left_on/right_on列名不同时不能同时指定on left_on/right_on left_index/right_index – 冲突 left_on/right_on – 用列名作为键时不能同时用索引作为键left_index/right_index – 用索引作为键时不能同时使用列名作为键 2. 索引参数冲突 left_index left_on 左表不能同时用索引和列作为键 right_index right_on 右表同理 3. 多列连接规则 允许用列表指定多列如 on[col1, col2]。但列表中的列名不能和索引混用!!! 2.3 示例1 门店销售数据.xlsx文件中Sheet1页签**(销售收入、销售成本、销售毛利)Sheet2页签(销售量)按照年、月和门店进行合并并存入新表销售新表中的Sheet1**中以使进行后续销售业务数据分析。 分析 首先这两个表都有年、月、门店合并也就是需要将销售量合并到Sheet1中所以使用左连接以年、月、门店三列作为复合键目标将sheet2合并到sheet1中并存入新表销售新表的Sheet1中 Sheet1 年月门店销售收入销售成本销售毛利2025Jan门店01478803.28295586.23183217.052025Jan门店02442108.16330633.55111474.612025Jan门店03367875.06190555.04177320.022025Jan门店04174356.94138562.7235794.22……… Sheet2 年月门店销售量2025Jan门店0119702025Jan门店0222042025Jan门店0312702025Jan门店04923……… 代码 import pandas as pd import numpy as npdf_Sheet1 pd.read_excel(门店销售数据-练手.xlsx, sheet_name0) df_Sheet2 pd.read_excel(门店销售数据-练手.xlsx, sheet_name1)# 将 Sheet2 合并到 Sheet1 中 -- 左连接 merge_df pd.merge(leftdf_Sheet1, rightdf_Sheet2, howleft, on[年,月,门店]) # 创建新表并将合并结果存入新的表格中 merge_df.to_excel(销售新表.xlsx, sheet_nameSheet1) New pd.read_excel(销售新表.xlsx, sheet_name0) # 检查新表是否正确 -- 打印前五行 print(New.head(5))打印结果Unnamed: 0 年 月 门店 销售收入 销售成本 销售毛利 销售量 0 0 2025 Jan 门店01 478803.28 295586.23 183217.05 1970 1 1 2025 Jan 门店02 442108.16 330633.55 111474.61 2204 2 2 2025 Jan 门店03 367875.06 190555.04 177320.02 1270 3 3 2025 Jan 门店04 174356.94 138562.72 35794.22 923 4 4 2025 Jan 门店05 182158.68 113867.90 68290.78 759新表数据 年月门店销售收入销售成本销售毛利销售量02025Jan门店01478803.28295586.23183217.05197012025Jan门店02442108.16330633.55111474.61220422025Jan门店03367875.06190555.04177320.02127032025Jan门店04174356.94138562.7235794.2292342025Jan门店05182158.68113867.968290.78759… 3 concat() 函数 3.1 介绍 merge()是横向连接也就是将左边的表和右边的表按照**键列值**进行拼接如果对于相似结构的DataFrame,使用concat()函数可以实现纵向合并可以连接两个或两个以上的DataFrame对象 函数原型 pandas.concat(objs, # 【常用】要连接的DataFrame或Series对象序列列表或字典axis0, # 【常用】0/index(纵向拼接)1/columns(横向拼接)joinouter, # 【常用】连接方式outer(默认保留所有列/行)inner(只保留共有列/行)ignore_indexFalse, # 是否忽略原索引重建新索引默认False保留原索引keysNone, # 创建分层索引的键用于标识不同来源数据levelsNone, # 指定用作分层索引的级别配合keys使用namesNone, # 分层索引的名称配合keys使用verify_integrityFalse, # 是否检查索引重复默认False不检查sortFalse, # 【常用】是否对非连接轴排序默认FalsecopyTrue # 是否复制数据默认True )objs 【必需】 连接对象接受包含多个DataFrame/Series的列表或字典示例[df1, df2] 或 {A: df1, B: df2} axis 【常用】 0 或 index行连接即纵向连接默认1 或 columns列连接即横向连接 join 【常用】 连接方式 outer保留所有列/行缺值填充NaNinner只保留共有列/行 ignore_index True丢弃原索引生成新数字索引0,1,2…False保留原索引可能导致索引重复 sort True默认将合并后的数据进行排序。性能会降低False不排可以提高性能 3.2 示例1 – 纵向连接 # 纵向连接 -- 行连接 concat_df1 pd.concat(objs[df_Sheet1,df_Sheet2], axis0, sortFalse) print(concat_df1)打印结果年 月 门店 销售收入 销售成本 销售毛利 销售量 0 2025 Jan 门店01 478803.28 295586.23 183217.05 NaN 1 2025 Jan 门店02 442108.16 330633.55 111474.61 NaN 2 2025 Jan 门店03 367875.06 190555.04 177320.02 NaN 3 2025 Jan 门店04 174356.94 138562.72 35794.22 NaN 4 2025 Jan 门店05 182158.68 113867.90 68290.78 NaN .. ... ... ... ... ... ... ... 475 2025 Dec 门店36 NaN NaN NaN 1169.0 476 2025 Dec 门店37 NaN NaN NaN 815.0 477 2025 Dec 门店38 NaN NaN NaN 706.0 478 2025 Dec 门店39 NaN NaN NaN 1001.0 479 2025 Dec 门店40 NaN NaN NaN 669.0[960 rows x 7 columns]3.3 示例2 – 横向连接 # 横向连接 -- 列连接 concat_df2 pd.concat(objs[df_Sheet1,df_Sheet2], axis0, sortFalse) print(concat_df2)打印结果年 月 门店 销售收入 销售成本 销售毛利 销售量 0 2025 Jan 门店01 478803.28 295586.23 183217.05 NaN 1 2025 Jan 门店02 442108.16 330633.55 111474.61 NaN 2 2025 Jan 门店03 367875.06 190555.04 177320.02 NaN 3 2025 Jan 门店04 174356.94 138562.72 35794.22 NaN 4 2025 Jan 门店05 182158.68 113867.90 68290.78 NaN .. ... ... ... ... ... ... ... 475 2025 Dec 门店36 NaN NaN NaN 1169.0 476 2025 Dec 门店37 NaN NaN NaN 815.0 477 2025 Dec 门店38 NaN NaN NaN 706.0 478 2025 Dec 门店39 NaN NaN NaN 1001.0 479 2025 Dec 门店40 NaN NaN NaN 669.0[960 rows x 7 columns]八 数据清洗 1 基本介绍 介绍和作用 数据清洗是数据分析的必要和重要步骤只有经过数据清洗数据才是干净的 分析的结果才是有价值的数据清洗是指发现并纠正数据文件中可是别的错误操作包括检查数据一致性处理无效值缺失值 清洗内容缺失值数据、重复值数据、其他异常数据 2 重复值处理 针对清洗重复数据Pandas提供了duplicated() 和 drop_duplicates() 两种方法 前者查找重复行后者删除查找到的重复行 2.1 duplicated () 函数 查找重复值如果对应的数据是重复的duplicated() 会返回 True否则返回 False返回类型是bool 函数语法 DataFrame.duplicated(subsetNone, keepfirst)subset 设置需要检查的列。如果是多个列可以使用列名的 list 作为参数。 示例subset[列1, 列2] keep 确定要标记的重复项 first默认标记除第一次出现的重复项 last标记除最后一次出现的重复项 False标记所有的重复项 示例 返回True的行表示有重复值 # 引入库 import numpy as np import pandas as pd # 读取数据 dfpd.read_excel(表.xlsx) # 查找重复项 print(df.duplicated().head())打印结果 0 True 1 False 2 False 3 False 4 False dtype: bool2.2 drop_duplicates()函数 2.2.1 基本介绍 返回内容返回删除重复行的DataFrame 函数语法: DataFrame.drop_duplicates(subsetNone, keepfirst, inplaceFalse, ignore_indexTrue )参数说明subset设置想要检查的列。如果是多个列可以使用列名的 list 作为参数keep确定要标记的重复项first默认标记除第一次出现的重复项last标记除最后一次出现的重复项False标记所有的重复项inplace默认为FalseTrue时直接在原数据上删除ignore_index是否重置索引True删除重复行后生成新索引0,1,2…False保留原始索引可能导致索引不连续 2.2.2 示例 删除**‘去重复项_练习.xlsx’**中的重复项并保留第一次出现的重复项 ‘去重复项_练习.xlsx’ 索引011121314253647586971081181291310 代码 – 不重置索引 # 引入库 import numpy as np import pandas as pd # 读取数据 dfpd.read_excel(去重复项_练习.xlsx) # 查找重复项 不重置索引 df.drop_duplicates(subsetNone,keepfirst, # 标记第一个出现的重复项inplaceTrue, # 在原数据修改ignore_indexFalse # 不重置索引 ) print(df.head(5))结果 左侧行索引是不连续的采取的原数据的索引 索引 0 1 4 2 5 3 6 4 7 5 8 6 9 7 10 8 12 9 13 10代码 – 重置索引 # 引入库 import numpy as np import pandas as pd # 读取数据 dfpd.read_excel(去重复项_练习.xlsx) # 查找重复项 不重置索引 df.drop_duplicates(subsetNone,keepfirst, # 标记第一个出现的重复项inplaceTrue, # 在原数据修改ignore_indexTrue # 重置索引 ) print(df)结果 可以明显看到第一列也就是行索引变成了从0到9 索引 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 103 缺失值处理 3.1 介绍 缺失值的处理包含两个步骤①缺失值判断 ②空值处理 常用函数 isna() # 检测空值 dropna() # 删除空值 fillna() # 使用指定的数据填充空值3.2 isna()函数 作用 函数检测给定系列对象汇总的缺失值。它返回一个bool值相同大小的对象指示值是否为NaN缺失值被映射到True并且将非缺失值映射到False 用法 df.isna():查看缺失值位置df.isna().any():判断某一列是否有缺失值df.isna0.sum():统计每列缺失值数量df.isna().sum().sum():统计DataFrame中缺失值合计数 3.3 dropna 函数 函数 DataFrame.dropna(axis0, # 删除轴向howany, # 删除条件threshNone, # 非缺失值阈值subsetNone, # 检查范围inplaceFalse # 是否原地修改 )参数 常用参数 常用参数说明axis默认为 0表示逢空值去除整行如果设置参数 axis 1 表示逢空值去掉整列howhowany如果一行(或一列)里任何一个数据有出现 NaN 就去掉整行默认howal 一行(或列)都是 NaN 才去掉这整行thresh设置需要多少非空值的数据才可以保留下来的subset设置想要检查的列。如果是多个列可以使用列名的list 作为参数inplaceTrue将计算得到的值直接覆盖之前的值并返回None修改的是源数据 示例代码 删除元数据上全为NaN的列 dropna(axis1,howall,inplaceTrue)3.3 fillna 函数 函数 DataFrame.fillna(valueNone, # 填充值methodNone, # 填充方法axisNone, # 填充轴向inplaceFalse, # 是否原地修改limitNone # 最大填充次数 )常用参数说明value固定值填充methodmethodNone默认使用指定的填充值填充methodffill或pad表示用前一个非缺失值去填充该缺失值method bflii或backfill表示用下一个非缺失值填充axis若axis0则对各行数据进行填充若axis1则对各列据进行填充inplacelimit为可选参数默认为False表示不修改原对象若指定inplaceTrue,则直接修改原对象。Iimit参数用于指定每列或每行缺失值填充的数量 代码示例 以0填充所有缺失值 df.fill(0)4 特殊字符删除 现将所有数据转换为字符串然后使用replace()函数进行替换一般与高阶函数同时使用 5 数据类型更改 数据类型更改:先使用属性查看数据类型再根据需求使用astype()函数更改数据类型 ①整数可以转换为浮点数 ②浮点数转整数时直接取整数位 ③字符串转数值型时字符串需全为数字 6 示例 删除表格中单元格包含的空格的符号将所有数字列转换为浮点数以每列平均值填充该列缺失值 dfpd.read_excel(门店销售数据(原表).xlsx) df df.map(lambda x:str(x).replace(, )) print(df) 九 pandas 高阶函数 1 Series.map() 方法 1.1 介绍 根据提供的函数对指定序列逐一做映射可以接受一个函数或含有映射关系的字典型对象。 将Series中每个元素逐一传入字典得到的返回值 也就是map是对Serise对象使用的所以对DataFrame用的时候可以直接取出一列或者一行就是 Series 对象 – map 不能对DataFrame使用 map() 的返回值是一个新的 Series其索引与原 Series 一致但值是根据映射关系转换后的结果 函数语法 Series.map(function / dict) #函数或字典参数可以是lambda匿名函数、自定义函数、内置函数也可以是字典 2.2 示例1 参数接收函数 根据读取的数据将销售收入达到400000被评为’优秀门店’否则标记为’非优秀门店’ 方法1 – 使用循环不易操作增加代码量 import pandas as pd import numpy as np # 读取表格数据 data pd.read_excel(门店销售数据(原表).xlsx, sheet_name0) # 对销售收入进行遍历 for i in data[销售收入].index:# 添加新列内容为优秀门店或非优秀门店data.loc[i,门店级别] 优秀门店 if data.loc[i,销售收入] 400000 else 非优秀门店 # 打印前5行检查数据是否正确 print(data.head())打印结果年 月 门店 销售收入 销售成本 销售毛利 门店级别 0 2025 Jan 门店01 478803.28 295586.23 183217.05 优秀门店 1 2025 Jan 门店02 442108.16 330633.55 111474.61 优秀门店 2 2025 Jan 门店03 367875.06 190555.04 177320.02 非优秀门店 3 2025 Jan 门店04 174356.94 138562.72 35794.22 非优秀门店 4 2025 Jan 门店05 182158.68 113867.90 68290.78 非优秀门店方法2 – 使用 map – 不用循环减少代码量 解释 data[销售收入] : 得到一个 Series 对象data[销售收入].map(函数): 对Series对象 {优秀门店:A类门店, 非优秀门店:其他门店}Series 索引输入值data[销售收入]映射规则lambda x: 优秀门店 if x 400000 else 非优秀门店输出值data[门店级别]0478803.28478803.28 400000 -- True优秀门店1442108.16442108.16 400000 -- True优秀门店2367875.06367875.06 400000 -- False非优秀门店3174356.94174356.94 400000 -- False非优秀门店4182158.68182158.68 400000 -- False非优秀门店 代码 # 方法2 # 读取表格数据 data pd.read_excel(门店销售数据(原表).xlsx, sheet_name0) # 使用 map 对新列 门店级别 进行判断操作 data[门店级别] data[销售收入].map(lambda x: 优秀门店 if x 400000 else 非优秀门店) # 打印前5行检查数据是否正确 print(data.head())打印结果年 月 门店 销售收入 销售成本 销售毛利 门店级别 0 2025 Jan 门店01 478803.28 295586.23 183217.05 优秀门店 1 2025 Jan 门店02 442108.16 330633.55 111474.61 优秀门店 2 2025 Jan 门店03 367875.06 190555.04 177320.02 非优秀门店 3 2025 Jan 门店04 174356.94 138562.72 35794.22 非优秀门店 4 2025 Jan 门店05 182158.68 113867.90 68290.78 非优秀门店2.3 示例2 参数接收字典 将数据中刚插入的**‘门店级别’列中’优秀门店’替换成’A类门店’其他替换为’其他门店’** Series 索引Series 元素Series 索引Series 元素0‘优秀门店’–0‘A类门店’1‘优秀门店’–1‘A类门店’2‘非优秀门店‘–2‘其他门店’3‘非优秀门店‘–3‘其他门店’4‘非优秀门店‘–4‘其他门店’ data[门店级别] data[门店级别].map({优秀门店:A类门店, 非优秀门店:其他门店}) print(data.head()) 打印结果年 月 门店 销售收入 销售成本 销售毛利 门店级别 0 2025 Jan 门店01 478803.28 295586.23 183217.05 A类门店 1 2025 Jan 门店02 442108.16 330633.55 111474.61 A类门店 2 2025 Jan 门店03 367875.06 190555.04 177320.02 其他门店 3 2025 Jan 门店04 174356.94 138562.72 35794.22 其他门店 4 2025 Jan 门店05 182158.68 113867.90 68290.78 其他门店2 Series/DataFrame.apply(function,args,axis) 方法 2.1 介绍 作用原理和map方法类似功能是遍历整个Series或DataFrame,对每个元素运行指定的函数参数只能是函数不能是字典map只能对Series使用apply可以对Series使用也可以对DataFrame使用 参数 参数说明argscab接收元组单个元素需加逗号隔开axis(1)axis0代表操作对列column进行 – 也就是跨行操作(2)axis1代表操作对行row进行 – 也就是跨列操作 axis0实现过程 当沿着轴0(axis0)进行操作时会将各列(columns)默认以Series的形式作为参数传入到指定的操作方法中操作后返回相应结果 2.2 示例1 将销售收入、销售成本、销售毛利三列数据修改为以万元显示,保留四位小数同时修改列名 沿行操作跨行操作需要指定 axis0 # 将销售收入、销售成本、销售毛利三列数据修改为以万元显示,保留四位小数同时修改列名 # 将三列改为以万元显示 data[[销售收入, 销售成本, 销售毛利]] data[[销售收入, 销售成本, 销售毛利]].apply(lambda x: round(x/10000, 4), axis0) # 修改列名 data.rename(columns{销售收入:销售收入(万元), 销售成本:销售成本(万元), 销售毛利:销售毛利(万元)}, inplaceTrue) print(data.head())打印结果年 月 门店 销售收入(万元) 销售成本(万元) 销售毛利(万元) 门店级别 0 2025 Jan 门店01 47.8803 29.5586 18.3217 A类门店 1 2025 Jan 门店02 44.2108 33.0634 11.1475 A类门店 2 2025 Jan 门店03 36.7875 19.0555 17.7320 其他门店 3 2025 Jan 门店04 17.4357 13.8563 3.5794 其他门店 4 2025 Jan 门店05 18.2159 11.3868 6.8291 其他门店2.3 示例2 计算每笔数据的毛利率将计算结果后添加“%且储在【毛利率】列 # 计算每笔数据的毛利率将计算结果后添加“%且储在【毛利率】列 # 法1 -- 匿名函数 data[销售毛利率] data.apply(lambda row: f{row[销售毛利(万元)] / row[销售收入(万元)] * 100:.2f}%,axis1 ) print(data.head())# 法2 -- 非匿名函数 def fun(row):ans (row[销售毛利(万元)] / row[销售收入(万元)]) * 100return f{ans:.2f}% data[销售毛利率] data.apply(fun, axis1) print(data.head())# 法3 -- 非匿名函数 -- 用这个方法的时候就不需要 * 100 了 def fun2(row):return format((row[销售毛利(万元)] / row[销售收入(万元)]),.2%) data[销售毛利率] data.apply(fun2, axis1) print(data.head())打印结果 # 计算每笔数据的毛利率将计算结果后添加“%且储在【毛利率】列 # 法1 -- 匿名函数 data[销售毛利率] data.apply(lambda row: f{row[销售毛利(万元)] / row[销售收入(万元)] * 100:.2f}%,axis1 ) print(data.head())# 法2 -- 非匿名函数 def fun(row):ans (row[销售毛利(万元)] / row[销售收入(万元)]) * 100return f{ans:.2f}% data[销售毛利率] data.apply(fun, axis1) print(data.head())# 法3 -- 非匿名函数 -- 用这个方法的时候就不需要 * 100 了 def fun(row):return format((row[销售毛利(万元)] / row[销售收入(万元)]),.2%) data[销售毛利率] data.apply(fun, axis1) print(data.head())3 DataFrame.applymap(function) 3.1 介绍 用法比较简单会对DataFrame中的每个元素执行指定方法的操作只对 DataFrame操作不对Series操作 但是这个函数在最新的Pandas中已经被弃用所以会出警告 这个警告信息表明在较新版本的 Pandas 中DataFrame.applymap() 方法已被弃用deprecated建议改用 DataFrame.map() 方法。不过需要注意的是map() 主要用于 Series而不是整个 DataFrame。3.2 示例 将原始data中销售收入(万元)销售成本(万元)和销售毛利(万元)三列统一保留一位小数显示 代码 # 将原始data中销售收入(万元)销售成本(万元)和销售毛利(万元)三列统一保留一位小数显示 data[[销售收入(万元), 销售成本(万元), 销售毛利(万元)]] data[[销售收入(万元), 销售成本(万元), 销售毛利(万元)]].applymap(lambda x: f{float(x):.1f}) print(data.head()) 打印结果年 月 门店 销售收入(万元) 销售成本(万元) 销售毛利(万元) 门店级别 销售毛利率 0 2025 Jan 门店01 47.9 29.6 18.3 A类门店 38.27% 1 2025 Jan 门店02 44.2 33.1 11.1 A类门店 25.21% 2 2025 Jan 门店03 36.8 19.1 17.7 其他门店 48.20% 3 2025 Jan 门店04 17.4 13.9 3.6 其他门店 20.53% 4 2025 Jan 门店05 18.2 11.4 6.8 其他门店 37.49%十 pandas数据分组聚合 1 介绍 数据分析处理时当我们收到一份成千上万行数据的源文件一般需要对数据进行分类汇总以更清晰的展现我们关注的数据并进行后续计算。在Pandas中也有**“分类汇总”**的功能分组、聚合。所谓分组聚合就是按一定的分类标准分组然后对每一组进行聚合操作 举例说明 原数据表 门店月份销售收入销售成本门店 011478803295586门店 021442108330633门店 012367875190555门店 022174356138562门店 033182158113897 按门店分组后 数据表1 门店月份销售收入销售成本门店 011478803295586门店 012367875190555 数据表2 门店月份销售收入销售成本门店 021442108330633门店 022174356138562 数据表3 门店月份销售收入销售成本门店 033182158113897 2 分组 – DataFrame.groupby() 函数 2.1 介绍 根据一列或多列将数据分成若干组。 2.2 查看分组结果的方法 DataFrame.groupby()方法返回DataFrameGroupBy类型数据需调用以下方法查看结果 group.size() - 查看分组后每组的数量group.groups - 查看分组情况group.get_group(组名) - 根据分组名称选择特定分组数据 2.3 函数语法 by指定的是分组键或叫分组依据 DataFrame.groupby(byNone, # 【常用】分组依据的列名或列名列表axis0, # 【常用】分组轴0按行分组(默认)1按列分组 但新版已经准备删除此参数levelNone, # 用于分组的层级索引级别as_indexTrue, # 【常用】是否将分组键作为结果索引sortTrue, # 【常用】是否对分组键进行排序group_keysTrue, # 调用apply时是否添加分组键squeezeFalse, # 是否尝试减少返回维度observedFalse, # 是否仅使用分类分组的观察值dropnaTrue, # 【新增】是否排除NA分组(新版本重要参数)**kwargs # 其他关键字参数 )参数是什么示例by分类标准分组键groupby(班级)axis(未来会移除)方向选择axis0(竖着分组)/axis1(横着分组)默认是行sort是否排序sortTrue(默认排序)/False(不排序)as_index是否用分组当索引as_indexTrue(默认)/False(当普通列) 注意axis 在Pandas 1.5 中已经被标记为果实未来版本将会彻底移除按行分组是唯一支持模式无需显性指示这个设计冗余也无需再用 2.4 示例 将表中的数据按照月分组分析每月总销售额并且将英文月变为数字月 # 使用map函数将DataFrame中的月列从英文缩写转换为数字格式 data[月] data[月].map(month_dict) # 按照月分组并且对每组进行求和每月求和 # 参数1: 「分组键」为 月, 参数2: 用 「分组键」 当做索引 data2 data.groupby(月, as_indexTrue).sum() print(data2)打印结果年 ... 销售毛利 月 ... 01 81000 ... 4282135.08 02 81000 ... 4238531.48 03 81000 ... 4194927.88 04 81000 ... 4345023.08 05 81000 ... 4301419.48 06 81000 ... 4257815.88 07 81000 ... 4407911.08 08 81000 ... 4364307.48 09 81000 ... 4320703.88 10 81000 ... 4470799.08 11 81000 ... 4427195.48 12 81000 ... 4383591.883 聚合 – DataFrame.agg() 函数 3.1 介绍 支持根据分组按多种方式进行聚合可以针对一列或多列选择相同或不同的聚合方式 3.2 函数语法 # DataFrame.agg() 函数参数详解python DataFrame.agg(funcNone, # 【核心】聚合函数支持字符串/函数/列表/字典axis0, # 【常用】聚合轴向0按列聚合(默认)1按行聚合*args, # 传递给聚合函数的位置参数**kwargs # 传递给聚合函数的关键字参数 )而参数func的内容可以是如下的方法 列和方法都可以写多个 方法描述count计算分组中的非NA值的数量sum计算非NA值的和mean计算非NA值的平均值median计算非NA值的算数中位数std, var计算非NA值的标准差和方差min, max获得非NA值的最小和最大值prod计算非NA值的积first, last获得第一个和最后一个非NA值 3.3 怎么用这个函数 单独使用 # 使用单个方法 df.groupby(类别).agg(mean) # 计算非NA平均值组合使用 # 同时使用多个方法 df.groupby(类别).agg([sum, median]) # 计算非NA总和和中位数按列定制 # 不同列使用不同方法 df.groupby(类别).agg({销量: [count, sum], # 非NA计数求和单价: [mean, max] # 非NA平均最大值 })3.4 示例1 将数据根据年、月列聚合后计算销售收入列的总和、平均值销售成本列的总和、平均值 import pandas as pd import numpy as npdata pd.read_excel(门店销售数据(原表).xlsx, sheet_name0) # 创建一个英文月份和数字月份对照的字典将英文月份转换为数字字符串 month_dict {Jan: 01, Feb: 02, Mar: 03,Apr: 04, May: 05, Jun: 06,Jul: 07, Aug: 08, Sep: 09,Oct: 10, Nov: 11, Dec: 12 }# 使用map函数将DataFrame中的月列从英文缩写转换为数字格式 data[月] data[月].map(month_dict) data3 data.groupby([年, 月]).agg({销售收入:[sum,mean], 销售成本:[sum,mean]}) print(data3) 打印结果销售收入 销售成本sum mean sum mean 年 月 2025 01 11985859.71 299646.49275 7703724.63 192593.1157502 11861774.91 296544.37275 7623243.43 190581.0857503 11737690.11 293442.25275 7542762.23 188569.0557504 12073592.11 301839.80275 7728569.03 193214.2257505 11949507.31 298737.68275 7648087.83 191202.1957506 11825422.51 295635.56275 7567606.63 189190.1657507 12161324.51 304033.11275 7753413.43 193835.3357508 12037239.71 300930.99275 7672932.23 191823.3057509 11913154.91 297828.87275 7592451.03 189811.2757510 12249056.91 306226.42275 7778257.83 194456.4457511 12124972.11 303124.30275 7697776.63 192444.4157512 12000887.31 300022.18275 7617295.43 190432.38575十一 pandas 数据透视表与轴向转换 1 基本介绍 1.1 数据透视表 首先现先简单介绍一下什么叫做数据透视表主要使用pivot_table()方法 简单说就是**“自动分类统计工具”**可以快速 按类别分组比如按地区、月份计算统计值比如求和、平均值重新排列数据行变列列变行 优点 比手工筛选快100倍不用写复杂公式Excel和Python都能用 1.2 轴向转换 在 Pandas 中轴向转换 指的是行变列、列变行来改变数据的展示形式主要涉及 stack() 和 unstack() 这两个核心方法 本质 就像玩**“俄罗斯方块”**把数据的行和列方向互相转换 stack()堆叠将列columns压缩成行index表格变窄变长 – 适合将多列数据合并为多行宽表 – 长表unstack()解堆叠将行index展开成列columns表格变宽变短 – 适合将多行数据展开为多列长表 – 宽表 2 DataFrame.pivot_table() 2.1 介绍 似于Excel里的数据透视表功能只要指定行、列、值和值的计算类型计数、合计、平均等就可以做出一个数据透视表来当分析庞大的数据时为了更好的发掘数据特征之间的关系且不破坏原数据就可以利用透视表进行操作 2.2 函数语法 DataFrame.pivot_table(valuesNone, # 【核心】要聚合的列可选不指定时默认聚合所有数值列 -- 就是要显示数值的列indexNone, # 【常用】行分组键单个列名或列名列表columnsNone, # 【常用】列分组键单个列名或列名列表aggfuncmean, # 【核心】聚合函数支持字符串/函数/列表/字典默认求平均值fill_valueNone, # 替换结果中的缺失值如0 或 N/AmarginsFalse, # 是否添加总计行/列默认Falsemargins_nameAll, # 总计行列的标签名当marginsTrue时生效dropnaTrue, # 是否排除包含NaN的分组默认TrueobservedFalse, # 是否只显示分类分组中存在的组合针对分类数据sortTrue # 是否对结果排序默认True )参数解释实例index数据透视表的行index[列1]columns数据透视表的列columns[列2]values数据透视表的值,默认是显示所有的值values[列3,列4]aggfunc值计算方式,默认是’mean’平均值还可以是sum,lenfill_value替换表中的NaN比如用0填充NaN,fill_value0margins是否添加行列的总计marginsTrue是汇总margins_name汇总栏命名默认为’All’margins_name‘名字’ 注意 pivot_table() 本质是 groupby()agg() 的快捷方式支持同时指定行/列分组二维聚合 2.3 示例 将月列中的英文列换成数字列以月为行年为列统计销售收入的合计和销售成本的平均数 import numpy as np import pandas as pd# - 将月列中的英文列换成数字列 # - 以月为行年为列统计销售收入的合计和销售成本的平均数data pd.read_excel(门店销售数据(原表).xlsx, sheet_name0) # 将月变成数字月 month_dict {Jan: 01, Feb: 02, Mar: 03,Apr: 04, May: 05, Jun: 06,Jul: 07, Aug: 08, Sep: 09,Oct: 10, Nov: 11, Dec: 12 } # 使用map函数将DataFrame中的月列从英文缩写转换为数字格式 data[月] data[月].map(month_dict) # 以月为行年为列统计销售收入的合计和销售毛利的平均数 data2 data.pivot_table(values[销售收入, 销售成本], # 显示的列index[月], # 数据透视表的行columns[年], # 数据透视表的列aggfunc{销售收入:sum,销售成本:mean},fill_value0, # 将 NaN 替换为数值 0marginsTrue, # 添加总计行/列margins_name统计 ) print(data2) 打印结果销售成本 销售收入 年 2025 统计 2025 统计 月 01 192593.11575 192593.11575 1.198586e07 1.198586e07 02 190581.08575 190581.08575 1.186177e07 1.186177e07 03 188569.05575 188569.05575 1.173769e07 1.173769e07 04 193214.22575 193214.22575 1.207359e07 1.207359e07 05 191202.19575 191202.19575 1.194951e07 1.194951e07 06 189190.16575 189190.16575 1.182542e07 1.182542e07 07 193835.33575 193835.33575 1.216132e07 1.216132e07 08 191823.30575 191823.30575 1.203724e07 1.203724e07 09 189811.27575 189811.27575 1.191315e07 1.191315e07 10 194456.44575 194456.44575 1.224906e07 1.224906e07 11 192444.41575 192444.41575 1.212497e07 1.212497e07 12 190432.38575 190432.38575 1.200089e07 1.200089e07 统计 191512.75075 191512.75075 1.439205e08 1.439205e083 DataFrame.stack 与 DataFrame.unstack 3.1 介绍 数据行列索引相互转换类似于Excel中的行列转置包括**stack()方法和unstack()方法**灵活运用轴向转换功能可轻松实现数据重塑 3.2 函数语法 DataFrame.stack(level-1, # 【可选】要堆叠的层级默认最后一层支持int/str/列表dropnaTrue # 【可选】丢弃堆叠后含 NaN 的行默认True )DataFrame.unstack(level-1, # 【可选】要展开的层级默认最后一层支持int/str/列表fill_valueNone # 【可选】替换NaN的内容 )DataFrame.stack解释实例level要堆叠的层级默认最后一层默认level1即最内测索引level0堆叠最外层level[日期, 城市]堆叠指定层级dropna是否丢弃堆叠后含 NaN 的行True默认丢弃False保留 ame.unstack解释实例level要展开的层级默认最后一层支持 - 整数如 1, -1 - 字符串列名 - 列表多层级level城市展开命名层级level[0, 1]展开前两个层级fill_value替换展开后生成的 NaN 的值 - None默认不替换 - 标量值如 0, 缺失fill_value0用 0 填充 NaNfill_value无 3.3 两者区别 两种方法作用方向典型场景示例stack()列 – 行将多列如月度数据合并为一列生成多级索引df.stack().reset_index()unstack()行 – 列将多级索引的某一层展开为列df.unstack(level城市) unstack()函数是stack()函数的逆操作 3.4 示例 以月列为行分组统计每月销售收入、销售成本的总和 # 以月列为行分组统计每月销售收入、销售成本的总和 data pd.read_excel(门店销售数据(原表).xlsx, sheet_name0) data2 data.groupby(by月, as_indexTrue).sum()[[销售收入, 销售成本]] print(data2) 打印结果销售收入 销售成本 月 Apr 12073592.11 7728569.03 Aug 12037239.71 7672932.23 Dec 12000887.31 7617295.43 Feb 11861774.91 7623243.43 Jan 11985859.71 7703724.63 Jul 12161324.51 7753413.43 Jun 11825422.51 7567606.63 Mar 11737690.11 7542762.23 May 11949507.31 7648087.83 Nov 12124972.11 7697776.63 Oct 12249056.91 7778257.83 Sep 11913154.91 7592451.03将销售收入、销售成本索引转换到行索引 – 即列转行 # 将销售收入、销售成本索引转换到行索引 – 即列转行 data2 data2.stack() print(data2) 打印结果 月 Apr 销售收入 12073592.11销售成本 7728569.03 Aug 销售收入 12037239.71销售成本 7672932.23 Dec 销售收入 12000887.31销售成本 7617295.43 Feb 销售收入 11861774.91销售成本 7623243.43 Jan 销售收入 11985859.71销售成本 7703724.63 Jul 销售收入 12161324.51销售成本 7753413.43 Jun 销售收入 11825422.51销售成本 7567606.63 Mar 销售收入 11737690.11销售成本 7542762.23 May 销售收入 11949507.31销售成本 7648087.83 Nov 销售收入 12124972.11销售成本 7697776.63 Oct 销售收入 12249056.91销售成本 7778257.83 Sep 销售收入 11913154.91销售成本 7592451.03 dtype: float64然后将刚才的表中的月行索引转换到列索引中去 – 即行转列 # 然后将刚才的表中的月行索引转换到列索引中去 – 即行转列 data2 data2.unstack(level月) print(data2) 打印结果 月 Apr Aug ... Oct Sep 销售收入 12073592.11 12037239.71 ... 12249056.91 11913154.91 销售成本 7728569.03 7672932.23 ... 7778257.83 7592451.03[2 rows x 12 columns]
http://www.zqtcl.cn/news/769383/

相关文章:

  • 外贸网站建设流程杭州软件定制开发
  • 网站的首页面设计软文推广特点
  • 网站描述在哪里写网页设计图片怎么换
  • 深圳网站关键词优化推广做mod游戏下载网站
  • 通达oa 做网站wordpress动转换标签别名
  • 三亚学做网站培训招聘网站排名
  • 企业网站建设费用需要多少钱怎样下载建设银行信用卡网站
  • 厦门建网站公司怎么做服装外贸网站
  • 做淘宝客网站用什么程序好仿站下载工具
  • 网站地图开发国家住房和城乡建设部中国建造师网站
  • 巫山网站建设泉州市培训建设系统中心网站
  • 网站开发国内外研究背景室内设计师收入高吗
  • 深圳网站维护一般多少钱沈阳做网站黑酷科技
  • 汽车营销服务网站建设怎样申请微信公众号个人
  • 阿里云 做网站北京工程建设交易中心网站
  • 网站备案安全承诺书竞价外包推广专业公司
  • 如何做公司网站广西住建厅八大员报名网站
  • 以下不是网站开发语言的哪项工信部域名备案管理系统
  • 优化网站搭建创业项目网站建设规划
  • 温岭网站开发网站建设程序文件
  • 有什么网站可以做深圳初二的试卷练习商城网站功能
  • 网站托管就业新闻今天的最新新闻
  • 重庆网站建设方案书国外做电商平台的网站有什么
  • 微信扫一扫登录网站如何做网络平台怎么弄
  • 怎么做网页模板展示网站株洲网红餐厅
  • 优秀学校网站设计正规抖音代运营公司排名
  • 网站的网站建设公司太原中小企业网站制作
  • 北京网站建设搜q.479185700模特公司网站模板
  • 网站设置什么意思wordpress 专题页面
  • 网站推广要具备什么购物网站多少钱