Pandas核心统计函数全解析:从describe到groupby的实战指南
1. 项目概述Pandas统计分析工具箱深度解析如果你正在用Python处理数据无论是从Excel里导出的销售报表还是从数据库里拉出来的用户日志Pandas几乎是你绕不开的瑞士军刀。但很多时候我们只是用它来read_csv和df.head()真正到了要洞察数据、做出判断的时候却对着那一堆数字不知从何下手。这时候Pandas内置的一整套统计分析方法就成了你的“火眼金睛”。今天我们不聊那些花里胡哨的高级操作就扎扎实实地把最常用、最核心的十几个统计函数——从describe、quantile到sum、mean再到idxmax、std、cumsum——给掰开揉碎了讲清楚。我会结合我这些年处理真实数据时踩过的坑和总结的技巧让你不仅知道怎么调用这些函数更明白在什么场景下该用哪一个以及如何解读它们吐出来的每一个数字。无论你是刚入门的数据分析师还是需要快速验证想法的业务同学这套工具箱都能让你对数据的理解立刻提升一个档次。2. 核心统计函数全景图与设计思路在深入每个函数之前我们得先有个大局观。Pandas的统计函数不是随意堆砌的它们共同构成了一个从数据概要、集中趋势、离散程度到数据排序的完整分析链条。理解这个设计思路你才能用得得心应手。2.1 函数分类与核心逻辑我们可以把这组函数大致分为四类这基本对应了你探索一份新数据时的思考路径全景快照型describe。这是你的第一站。拿到数据别急着算平均值先用describe()快速扫一眼。它能一次性给出数据行数、均值、标准差、最小值、分位数和最大值。其设计逻辑是“用最小的成本获取最大的信息量”帮你迅速判断数据是否有严重问题比如缺失值太多以及数据的大致分布范围。集中趋势度量型mean均值、median中位数、sum总和、count非空计数。这类函数回答的是“数据的中心在哪里”以及“总量有多大”。mean对极端值敏感median则更稳健。sum和count则是业务分析的基础比如计算总销售额、总用户数。离散程度与分布型std标准差、var方差、mad平均绝对偏差、quantile分位数。当你知道数据的中心后下一步自然要问“数据波动大不大是否稳定”。std和var衡量数据点与均值的平均偏离程度是经典的风险或波动性指标。mad是另一种稳健的离散度度量。quantile则直接刻画分布形态特别是中位数50%分位数和四分位数25% 75%。极值与位置索引型max最大值、min最小值、idxmax最大值索引、idxmin最小值索引。这类函数帮你快速定位数据的边界和特殊点。idxmax/idxmin的价值在于它不仅告诉你是多少还告诉你在哪里这对于溯源分析至关重要。这个链条是递进的先看全景(describe)再看中心(mean/median)然后分析波动(std)最后定位特异点(idxmax)。Pandas通过将这些函数设计为DataFrame和Series对象的方法并保持一致的API如支持axis参数指定行列支持skipna处理缺失值使得整个分析流程可以像搭积木一样顺畅组合。2.2 为什么是这些函数—— 统计学与业务场景的桥梁你可能会想统计学里那么多概念为什么Pandas优先集成了这些根本原因在于它们与业务场景的强关联性。描述性统计是沟通的基础当你向业务方汇报时说“这个月的用户活跃度均值是15.3但标准差有12.1说明个体差异很大”远比扔过去一张满是数字的表格有效。describe和std提供了这种沟通的语言。分位数比均值更能反映“大多数”在收入分析、页面加载时间等通常呈偏态分布的数据中median中位数和quantile比mean更能代表普通用户的体验。比如网站响应时间的99分位数能告诉你最慢的那1%用户的糟糕体验。索引查找是分析动作的起点idxmax找到销售额最高的那天你接下来就会去分析那天的营销活动idxmin找到故障率最低的版本你就找到了优化的基准。它们将统计结果直接转化为分析动作。Pandas的选择实质上是将最普适、最能驱动决策的统计量以最便捷的编程接口提供出来。理解这一点你就不会把它们当作孤立的函数而是一套组合拳。3. 核心函数深度解析与避坑指南接下来我们进入实战环节。我会假设你有一个名为df的DataFrame包含‘sales’销售额、‘visitors’访客数、‘date’日期等字段并穿插一些有缺失值或异常值的数据来模拟真实情况。3.1 全景侦察兵describe() 与 quantile()df.describe()是你探索数据的雷达。默认情况下它只对数值型列进行统计并返回count,mean,std,min,25%,50%,75%,max。import pandas as pd import numpy as np # 生成示例数据 np.random.seed(42) df pd.DataFrame({ sales: np.random.randint(100, 1000, 20), visitors: np.random.randint(50, 500, 20), category: np.random.choice([A, B, C], 20) }) # 故意插入一些缺失值和异常值 df.loc[5, sales] np.nan df.loc[10, visitors] 2500 # 异常高值 print(df.describe())关键输出解读与避坑count行立刻告诉你sales列有19个非空值visitors有20个。如果某列count远小于数据行数缺失值问题就需要优先处理。mean与std观察visitors的均值(约407)和标准差(约533)。标准差几乎和均值一样大这是一个强烈的信号提示数据可能存在极端值或分布非常分散。这时你就需要警惕均值可能不具有代表性。25%,50%(中位数),75%比较visitors的中位数(302.5)和均值(407)。中位数远小于均值这是数据右偏存在极大值的典型特征印证了我们对异常值的怀疑。min和max直接看到visitors的最大值是2500坐实了异常值的存在。避坑指南1describe的include/exclude参数默认只分析数值列。如果你的数据包含分类变量object或category类型可以使用df.describe(include‘all’)来获取所有列的统计分类列会显示唯一值数量、最高频类别等。反过来也可以用exclude[np.object]来排除特定类型。quantile()是describe中分位数的灵活扩展。你可以计算任意分位点。# 计算销售额的10% 中位数 90%分位数 print(df[sales].quantile([0.1, 0.5, 0.9])) # 处理缺失值默认跳过也可以使用插值法 print(df[sales].quantile(0.5, interpolationmidpoint))避坑指南2quantile的插值方法当分位点位于两个数据点之间时interpolation参数决定如何计算。默认是linear。对于需要更稳健估计的场景如金融风险计量可能会选择lower、higher或midpoint。了解你所在领域的惯例很重要。3.2 集中趋势三剑客mean, median, sum, count这四个函数看似简单但用错场景就会导致结论谬误。mean()vsmedian()这是最经典的抉择。对于sales这类可能包含少数大单的数据median中位数往往比mean均值更能反映“典型”订单大小。在上面的数据中因为sales是我们生成的均匀随机数两者可能接近。但对于真实业务数据尤其是收入、消费金额、页面停留时间一定要同时计算并对比两者。如果差异很大报告中优先使用中位数并备注说明均值受极端值影响。sum()这是业务指标的基础。但务必注意缺失值df.sum()默认会跳过缺失值(skipnaTrue)这意味着如果你有一行数据sales是NaN它不会被计入总和。这通常是合理的但你必须心里有数。如果你希望将NaN视为0需要先填充df[‘sales’].fillna(0).sum()。count()它返回的是非空值的数量而不是总行数。总行数是len(df)。在计算平均值时Pandas的mean()内部就是用sum() / count()实现的。经常用count()来检查数据完整性。一个综合示例print(f总销售额跳过NaN: {df[sales].sum():.2f}) print(f有效销售记录数: {df[sales].count()}) print(f平均销售额均值: {df[sales].mean():.2f}) print(f销售额中位数: {df[sales].median():.2f}) # 假设我们想计算日均销售额但有些天数据缺失NaN # 错误做法df[sales].sum() / len(df) # 分母包含了缺失值的天数 # 正确做法使用mean()或手动计算 daily_avg_correct df[sales].mean() print(f正确的日均销售额: {daily_avg_correct:.2f})3.3 离散程度洞察者std, var, mad方差(var)、标准差(std)和平均绝对偏差(mad)都衡量数据的离散程度但各有侧重。var()(方差): 各数据点与均值之差的平方的平均数。平方放大了较大偏差的影响因此对方差影响大。std()(标准差): 方差的平方根。它和原始数据有相同的量纲更易于解释。例如销售额的标准差是500元你可以直观理解为销售额通常波动在±500元左右。mad()(平均绝对偏差): 各数据点与均值或中位数之差的绝对值的平均数。它对异常值不如方差/标准差敏感更稳健。如何选择绝大多数场景用std因为它最通用且是许多统计模型如正态分布的基础参数。需要稳健估计时用mad当数据中存在显著异常值你又不想让这些异常值过度影响对“普通”数据波动性的判断时mad是更好的选择。你可以指定基于中位数计算df[‘sales’].mad()默认基于均值df[‘sales’].mad(skipnaTrue)计算基于中位数的MAD。var更多用于中间计算在手动进行一些统计检验或公式推导时可能会用到。print(f销售额标准差: {df[sales].std():.2f}) print(f销售额方差: {df[sales].var():.2f}) print(f销售额平均绝对偏差(MAD): {df[sales].mad():.2f}) # 观察异常值对三者的影响 data_with_outlier pd.Series([100, 200, 300, 400, 500, 10000]) # 最后一个值是异常值 print(f\n含异常值的数据:) print(fStd: {data_with_outlier.std():.2f}) print(fVar: {data_with_outlier.var():.2f}) print(fMAD: {data_with_outlier.mad():.2f}) # 你会发现std和var被异常值极大地拉高了而MAD相对受影响较小。3.4 极值定位器max, min, idxmax, idxminmax/min告诉你极值是多少而idxmax/idxmin告诉你它在哪里。这个“在哪里”可能是行索引也可能是时间索引对于分析至关重要。max_sales df[sales].max() date_of_max_sales df[sales].idxmax() # 返回最大销售额对应的索引标签 print(f最高销售额: {max_sales}) print(f最高销售额发生在索引为: {date_of_max_sales} 的行) # 更常见的场景你想知道销售额最高那天所有的数据 row_with_max_sales df.loc[df[sales].idxmax()] print(f\n销售额最高那天的完整记录:\n{row_with_max_sales})避坑指南3idxmax/idxmin与缺失值如果整列都是NaNidxmax会抛出ValueError。如果存在NaN默认情况下idxmax会忽略NaN并返回非NaN值中的最大值索引。但如果你希望NaN被视为最小或最大值需要先使用fillna进行处理。在涉及时间序列或重要排序时务必清楚缺失值如何处理。3.5 累积分析器cumsum, cumprod, cummax, cummin累积函数提供了一种“随时间演进”的视角。cumsum累积和是最常用的它可以用来计算累计销售额、累计用户数等。df[cumulative_sales] df[sales].cumsum() print(df[[sales, cumulative_sales]].head(10)) # 结合绘图可以直观看到增长趋势 import matplotlib.pyplot as plt df[cumulative_sales].plot(title累计销售额趋势) plt.show()高级技巧cumsum经常用于计算滚动目标完成率。例如你有一个月的每日目标销售额用cumsum可以轻松算出截至每一天的累计完成额和完成率。4. 多维分析与分组统计实战单个序列的统计只是开始Pandas的强大之处在于可以轻松进行多维度的分组分析。4.1 按列与按轴理解axis参数axis参数决定了计算的方向axis0或‘index’默认值。沿着行的方向按列计算。即对每一列的所有行进行聚合结果是一个每列一个统计值的Series。axis1或‘columns’沿着列的方向按行计算。即对每一行的所有列进行聚合结果是一个每行一个统计值的Series。# 按列计算默认求每一列的平均值 print(df[[sales, visitors]].mean(axis0)) # 输出 sales列的平均值 visitors列的平均值 # 按行计算求每一行的销售额和访客数的总和假设需要计算“单客价值”相关的中间指标 df[row_sum] df[[sales, visitors]].sum(axis1) print(df[[sales, visitors, row_sum]].head())4.2 分组聚合groupby 统计函数这是业务分析的核心。例如我们想按category类别分析销售情况。group_stats df.groupby(category)[sales].agg([count, mean, median, std, sum]) print(group_stats)解读上表你可以立刻看到A、B、C每个类别的订单数、平均销售额、中位数销售额、销售额波动性以及总销售额。这比看整体数字有价值得多。更复杂的聚合一次性对多列进行多种统计。# 对sales和visitors分别进行多种统计 agg_dict { sales: [min, max, mean, sum], visitors: [mean, std, count] } detailed_group_stats df.groupby(category).agg(agg_dict) print(detailed_group_stats) # 结果是一个多级索引的DataFrame信息量非常丰富。4.3 处理缺失值skipna参数的精妙之处几乎所有统计函数都有一个skipna参数默认为True。这意味着在计算时自动排除NaN。skipnaTrue(默认)df[‘sales’].mean()计算时忽略NaN。这是最常用的行为。skipnaFalse如果序列中存在任何NaN则整个计算结果也是NaN。这在你需要严格确保数据完整性或者NaN代表某种特殊含义如“未测量”时使用。关键决策点在分组聚合中skipna的行为是一致的。如果你在groupby后求mean每个组内的NaN会被忽略。但你需要思考一个组内如果大部分是NaN计算出的均值还有意义吗有时你可能需要先检查每个组的有效数据数量df.groupby(‘category’)[‘sales’].count()。5. 性能优化与常见问题排查当数据量很大时统计计算的效率就需要考虑。此外一些看似奇怪的结果也需要知道如何排查。5.1 选择正确的数据类型Pandas统计函数的速度与列的数据类型dtype密切相关。数值类型(int,float)计算速度最快。对象类型(object)通常存储字符串对其调用mean()等函数会报错或返回NaN。describe()对于object列会输出不同的统计项如唯一值数、最高频值。分类类型(category)对于低基数唯一值少的分类变量使用category类型可以极大节省内存但某些统计函数可能不如数值型高效。建议在进行分析前使用df.dtypes检查数据类型并使用pd.to_numeric配合errors‘coerce’或astype方法将需要计算的列转换为数值类型。5.2 避免在循环中调用统计函数这是新手常犯的性能错误。不要这样写# 错误低效 for cat in df[category].unique(): mean_val df[df[category] cat][sales].mean() # ... do something而应该使用向量化操作即前面介绍的groupby# 正确高效 means df.groupby(category)[sales].mean()groupby底层经过了高度优化比手写循环快几个数量级。5.3 常见错误与解决方案速查表问题现象可能原因解决方案调用mean()等函数返回NaN该列所有值都是NaN或全是非数值类型如字符串。检查数据df[‘col’].unique()或df[‘col’].isna().all()。确保数据类型正确。describe()输出不包含某列该列是非数值类型如object。使用df.describe(include‘all’)查看所有列或将该列转换为数值型。idxmax()返回的结果不符合预期存在多个相同的最大值idxmax只返回第一个出现的索引。如果需要所有最大值的索引使用df.index[df[‘col’] df[‘col’].max()].tolist()。分组聚合结果出现多层列名对多列应用了多种聚合函数产生了MultiIndex。使用.droplevel或.reset_index来扁平化列名或使用agg时指定更简单的输出格式。cumsum计算后出现NaN原始序列开头就有NaN累积操作会传播NaN。在计算前处理缺失值df[‘col’].fillna(0).cumsum()或df[‘col’].fillna(method‘ffill’).cumsum()。统计结果与SQL或Excel不一致1. 缺失值处理方式不同 (skipna)。2. 浮点数精度问题。3. 分组逻辑有误如是否包含NULL组。1. 确认各工具对NULL/NaN的处理逻辑。2. 使用round()函数控制精度。3. 仔细检查groupby的键和where条件。5.4 调试技巧从小样本开始当你对一个复杂的链式操作如多个groupby、agg、transform的组合结果有疑问时不要在大数据集上调试。使用df.head(10)或df.sample(5)创建一个极小的、可控的样本数据手动计算验证你的逻辑是否正确。这是定位逻辑错误最快的方法。掌握这套Pandas统计工具箱并理解其背后的设计逻辑与适用场景你就能在面对一堆杂乱的数据时迅速抽丝剥茧找到关键洞察。记住这些函数不是孤立的将它们与数据筛选、清洗、可视化结合起来才能发挥最大威力。真正的数据分析高手比拼的往往不是用了多复杂的模型而是对这些基础工具是否用得炉火纯青。

相关新闻

SpringBoot+Vue+MySQL企业客户管理系统开发实践

SpringBoot+Vue+MySQL企业客户管理系统开发实践

1. 项目概述:企业客户管理系统的技术架构与价值 这个基于SpringBootVueMySQL的企业客户管理系统,是我在指导毕业设计过程中反复验证过的经典架构组合。它完美体现了现代企业级应用开发的主流技术路线——SpringBoot提供稳健的后端服务,Vue构建…

2026/9/25 12:30:35 阅读更多 →
推荐几个指标中台分析系统品牌

推荐几个指标中台分析系统品牌

当前企业在数字化转型中普遍面临底层数据孤岛严重、前端业务取数门槛高的问题。据《2026年企业数据中台系统选型研究》(新浪财经,2026年1月)显示,2026 年的指标中台正从重底层治理向“业务自助与 Data AI 驱动”演进。本文将为 C…

2026/10/6 12:49:51 阅读更多 →
有哪些用户行为分析平台品牌

有哪些用户行为分析平台品牌

企业面临数据孤岛和业务增长瓶颈时,迫切需要了解市面上有哪些用户行为分析平台品牌。根据 2026 年市场调研机构发布的数据智能报告,当前工具已形成基础统计、通用运营、垂直行业和新一代 AI Agent 驱动四大阵营。 本文旨在帮助企业决策者、数据分析师及 …

2026/10/12 19:20:50 阅读更多 →

最新新闻

CO-RE实战:一次编译到处运行,解决eBPF内核适配难题

CO-RE实战:一次编译到处运行,解决eBPF内核适配难题

1. 为什么要折腾 CO-RE:从一次内核升级说起如果你在服务器上跑过基于 BPF 的追踪工具,大概率遇到过一个既无奈又经典的报错:libbpf: failed to find valid kernel BTF或者更早以前,你辛辛苦苦在开发机上编译好的 BPF 程序&#xf…

2026/10/13 7:14:58 阅读更多 →
RNN文本生成实战:从LSTM复读到温度采样与避坑指南

RNN文本生成实战:从LSTM复读到温度采样与避坑指南

简介:一个RNN文本生成实战项目包,面向自然语言处理初学者与深度学习实践者,完整演示了基于循环神经网络的语言模型构建与自动文本生成流程。模型使用网上收集的周杰伦歌词作为训练语料,涵盖数据清洗、词汇表创建、序列填充、分词编…

2026/10/13 7:14:58 阅读更多 →
Broadcom交换芯片转发流水线解析:从VLAN到ACL的SDK配置与排障

Broadcom交换芯片转发流水线解析:从VLAN到ACL的SDK配置与排障

简介:这份PDF资料聚焦博通BCM系列交换芯片的工作原理,面向网络设备研发、驱动开发与运维工程师,以及需要理解数据中心交换底层机制的技术人员。内容从Architectural系统逻辑视图切入,梳理Ingress Chip、Switch Fabric与Egress Chi…

2026/10/13 7:14:58 阅读更多 →
模型无关智能体平台:400个插件打造自动化AI工作流

模型无关智能体平台:400个插件打造自动化AI工作流

这次我们来看一个出现在 GitHub 快报第 375 期里的开源项目。它不是什么新模型,而是一个“模型无关”的智能体技能平台,核心卖点很直白:内置插件数量号称接近 400 个,涵盖搜索、文档处理、数据分析、网页抓取、消息推送、定时任务…

2026/10/13 7:14:58 阅读更多 →
Flutter for OpenHarmony 逆向思维训练App:时间分析与性能优化实战

Flutter for OpenHarmony 逆向思维训练App:时间分析与性能优化实战

从 Flutter 跨端开发切到 OpenHarmony 生态,再搭配一个逆向思维训练 App 的完整实战,这个组合听起来就很“技术博主”。我不久前刚好完整跑通了一个类似项目,标题就叫 flutter_for_openharmony 逆向思维训练 App 实战 时间分析实现。今天把整…

2026/10/13 7:14:58 阅读更多 →
Win7离线OCR工具:PaddleOCR-json免Python部署实战

Win7离线OCR工具:PaddleOCR-json免Python部署实战

简介:win7-x64-PaddleOCR-json.zip是面向Windows 7 64位系统的PaddleOCR部署压缩包,适用于需要在旧版平台快速搭建文字识别能力、并通过JSON格式获取结构化结果的开发者和运维人员。包内共64个文件,总体积约126.19MB。其中dll动态库用于支撑推…

2026/10/13 7:13:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →