简介本资源是一份面向Python初学者与数据分析入门者的系统性学习指南聚焦数据处理与可视化核心能力培养适用于高校学生、转行新人及需快速上手业务分析的职场人员。文档以PDF格式呈现共1个文件大小仅114KB轻量便携涵盖Pandas、NumPy、Matplotlib、Seaborn等主流库的核心用法对比与协同实践特别梳理了数据清洗、统计计算、多维图表绘制等高频场景的操作逻辑并附有可直接运行的代码示例如CSV读取、均值计算与条形图可视化。内容结构清晰从库定位到典型调用链路层层递进兼顾原理说明与实操提示帮助读者建立完整技术认知框架。目前已有1853人学习下载是理解Python数据分析技术栈组成与协作关系的高性价比入门参考。1. 这不是一本“Python入门书”而是一份能直接塞进你项目根目录跑起来的分析流水线手册你刚接手一个新需求清洗三张不同格式的销售表CSV/Excel/JSON合并后按区域时间维度聚合再生成带置信区间的折线图和热力图最后导出 PDF 报告发给业务方——明天上午十点前。这时候翻《Python编程从入门到实践》来不及。打开这本《python数据分析与可视化.pdf》你会在第 27 页看到一个完整可复现的sales_pipeline.py脚本它用pandas.read_*自动识别输入格式用pd.concat(..., joinouter)处理字段缺失用statsmodels.tsa.seasonal.seasonal_decompose做趋势分解用seaborn.heatmap(..., cbar_kws{format: %.1f%})控制热力图数值精度最后调matplotlib.backends.backend_pdf.PdfPages批量存图。这不是教学幻灯片是某实验室真实跑过 200 次周报任务的生产级模板。适合两类人一类是刚转岗的数据工程师需要把 Excel 表格快速变成可追踪、可回滚的代码逻辑另一类是算法同学想绕过 Matplotlib 底层 API 的玄学参数在 15 分钟内把模型评估结果可视化成业务能看懂的图表。它不讲“什么是 DataFrame”但会告诉你.dropna(howall)和.dropna(howany)在真实脏数据里差出 37% 的行数——这种血泪经验全藏在脚注和代码注释里。2. Pandas 数据清洗不是“删空行”而是构建可验证的数据契约2.1 为什么read_csv必须配dtype和converters真实业务数据里ID 列常混入“#N/A”“NULL”“-”甚至空格字符串若依赖 pandas 默认推断类型00123可能被转成整数123导致后续关联失败。正确做法是在读取阶段就固化类型契约import pandas as pd # 错误示范让 pandas 自己猜 # df pd.read_csv(sales.csv) # ID列可能变int丢失前导零 # 正确示范显式声明类型 预处理 dtypes { order_id: string, # 强制为字符串保留前导零和特殊字符 amount: float64, # 明确数值类型避免object类型后续计算报错 region: category # 分类变量节省内存且加速groupby } converters { date: lambda x: pd.to_datetime(x, errorscoerce).date() # 强制转日期无效值设为NaT } df pd.read_csv( sales.csv, dtypedtypes, convertersconverters, na_values[, NULL, #N/A, -], # 显式声明哪些字符串算缺失值 keep_default_naFalse # 关键禁用默认na_values否则NA也会被误判 )提示keep_default_naFalse是关键开关。默认情况下 pandas 会把NANaNnull全当缺失值但业务系统里NA常表示“不适用”如未填写的选填项需保留为字符串。这个参数必须和na_values配合使用否则na_values不生效。2.2fillna()的四个层级从简单填充到业务规则注入空值处理不能一刀切。df.fillna(0)看似省事但金额为 0 和“未知金额”语义完全不同。该手册第 41 页给出分层策略填充层级适用场景代码示例验证方式Level 0静态值数值型字段的明确默认值如库存下限df[stock].fillna(0, inplaceTrue)assert df[stock].isna().sum() 0Level 1前向/后向填充时间序列连续性要求如日志缺失df.sort_values(date).fillna(methodffill)检查填充后是否出现跨月/跨季度跳跃Level 2分组统计填充同区域同产品类别的均值业务合理性df[price].fillna(df.groupby([region,category])[price].transform(mean))对比填充前后groupby(region).price.std()变化率 5%Level 3规则函数填充复杂业务逻辑如“促销价标价×0.8但不低于成本价”df[promo_price] df.apply(lambda r: max(r[cost], r[list_price]*0.8) if pd.isna(r[promo_price]) else r[promo_price], axis1)单元测试覆盖边界条件cost100, list_price120→promo_price962.3duplicated()的隐藏陷阱subset和keep参数如何决定去重结果df.drop_duplicates()看似简单但subset[user_id,order_time]时若order_time是datetime64[ns]类型毫秒级差异会导致本应合并的订单被当成两条记录。手册建议先做时间对齐# 错误直接去重忽略时间精度问题 # df_clean df.drop_duplicates(subset[user_id,order_time]) # 正确先截断到分钟级再按业务意义去重 df[order_minute] df[order_time].dt.floor(T) # 截断到分钟 df_clean df.drop_duplicates( subset[user_id, order_minute], keeplast # 保留同一分钟内最后一条通常为支付成功状态 ).drop(columns[order_minute])keeplast的选择有业务依据支付系统中同一分钟内多次请求最后一条大概率是最终状态如“支付成功”覆盖“处理中”。若用keepfirst可能保留错误中间态。3. Matplotlib Seaborn 可视化不是“画图”而是构建可复用的图形组件库3.1 为什么plt.figure(figsize(10,6))必须放在plt.subplot()之前这是新手高频翻车点。plt.subplot()会自动创建 figure若先调用plt.subplot()再调plt.figure()后者会新建一个空白 figure导致plt.show()显示空图。正确顺序是# ✅ 正确先声明figure再加子图 fig plt.figure(figsize(12, 8)) ax1 fig.add_subplot(2, 2, 1) # 第一行第一列 ax2 fig.add_subplot(2, 2, 2) # 第一行第二列 ax3 fig.add_subplot(2, 1, 2) # 第二行跨两列 # 绘图操作 ax1.plot(df[date], df[revenue]) ax2.scatter(df[cost], df[revenue]) ax3.bar(df[region], df[profit]) # 统一设置标题和标签 fig.suptitle(Q3 Sales Dashboard, fontsize16, fontweightbold) plt.tight_layout() # 关键防止子图重叠 plt.show()注意plt.tight_layout()必须在plt.show()前调用否则子图标题可能被截断。它会自动调整子图间距但若手动设置了fig.subplots_adjust()则tight_layout()会失效二者不可混用。3.2 Seaborn 的hue参数如何避免颜色混淆当分类变量超过 5 个时sns.lineplot(datadf, xdate, yvalue, hueregion)默认颜色会难以区分。手册第 89 页提供三步法预定义调色板用sns.color_palette(husl, n_colorslen(df[region].unique()))生成高对比度色系映射语义颜色将核心区域如华东设为蓝色偏远区域如西北设为橙色增强可读性添加图例控制plt.legend(bbox_to_anchor(1.05, 1), locupper left)将图例移出主图区。import seaborn as sns import matplotlib.pyplot as plt # 获取唯一区域并排序确保颜色顺序稳定 regions sorted(df[region].unique()) palette sns.color_palette(husl, len(regions)) # 构建颜色映射字典业务语义优先 color_map { 华东: #1f77b4, # 蓝色系代表核心市场 华南: #ff7f0e, # 橙色系代表增长市场 华北: #2ca02c, # 绿色系代表稳定市场 西南: #d62728, # 红色系代表潜力市场 西北: #9467bd # 紫色系代表拓展市场 } # 其他区域用 palette 剩余色 for i, r in enumerate(regions): if r not in color_map: color_map[r] palette[i % len(palette)] # 绘图 plt.figure(figsize(12, 6)) sns.lineplot( datadf, xdate, yrevenue, hueregion, palettecolor_map, linewidth2.5, markero, markersize4 ) plt.title(Revenue Trend by Region (Q3), fontsize14) plt.xlabel(Date) plt.ylabel(Revenue (¥)) plt.legend(bbox_to_anchor(1.05, 1), locupper left) plt.grid(True, alpha0.3) plt.show()3.3 保存高清图的三个致命参数dpi、bbox_inches、facecolorplt.savefig(chart.png)默认保存的图在 PPT 里放大后模糊。必须显式设置# ✅ 生产级保存参数 plt.savefig( revenue_trend_q3.png, dpi300, # 分辨率300 DPI 满足印刷要求 bbox_inchestight, # 紧凑布局裁掉空白边距 facecolorwhite, # 背景强制白色避免PPT里显示灰色底 edgecolornone, # 去除边框线 pad_inches0.1 # 边距微调避免标题被裁 ) # ✅ PDF 矢量图无限缩放不失真 plt.savefig(revenue_trend_q3.pdf, formatpdf, bbox_inchestight)提示bbox_inchestight会重新计算布局若图中含plt.text()绝对坐标可能被裁掉。此时改用bbox_inches0并手动调plt.subplots_adjust()。4. Plotly 交互式图表不是“炫技”而是解决业务方“我想看这个区域的明细”的刚需4.1 用plotly.express三行代码实现钻取式仪表盘业务方常问“这张全国热力图里点击‘华东’能不能展开看上海、江苏、浙江的明细”Plotly 原生支持事件绑定但plotly.express更轻量import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots # 主热力图全国 fig_main px.choropleth( df_region, locationsregion_code, colorrevenue, hover_nameregion, titleNational Revenue Heatmap, color_continuous_scaleViridis ) # 关键添加点击事件回调需配合 Dash 或前端 JS # 但手册提供降级方案生成带链接的 HTML fig_main.write_html(national_heatmap.html, include_plotlyjscdn) # 生成区域明细页示例华东 df_east df[df[region].isin([上海,江苏,浙江])] fig_east px.bar( df_east, xcity, yrevenue, colorproduct_category, titleEast China Revenue by City Category ) fig_east.write_html(east_china_detail.html, include_plotlyjscdn)注意纯 HTML 导出不支持实时交互但include_plotlyjscdn会从 CDN 加载最新 JS保证图表渲染兼容性。若内网环境改用include_plotlyjsdirectory并提前下载离线包。4.2plotly.graph_objects中update_traces()的链式调用技巧px.line()生成的图样式有限需底层 API 微调。update_traces()支持链式调用避免重复写fig.data[0].line.width 3import plotly.graph_objects as go fig go.Figure() fig.add_trace(go.Scatter( xdf[date], ydf[revenue], modelinesmarkers, nameRevenue, linedict(width3, color#1f77b4), markerdict(size6, symbolcircle) )) # 链式更新一次调用修改多个属性 fig.update_traces( hovertemplateb%{x}/bbrRevenue: %{y:.2f}¥extra/extra, connectgapsTrue # 连接缺失值之间的线段业务上更合理 ).update_layout( titleRevenue Trend with Gaps Connected, xaxis_titleDate, yaxis_titleRevenue (¥), hovermodex unified, # 同一X轴位置显示所有曲线值 templateplotly_white # 白色背景适配PPT ) fig.show()hovermodex unified是关键体验优化鼠标悬停某天同时显示当日所有指标收入、成本、利润无需反复移动鼠标。4.3 导出为静态图时kaleido的安装避坑fig.write_image(chart.png)需要kaleido引擎但直接pip install kaleido在 Windows 上常因chromium下载失败# ❌ 失败率高的命令 # pip install kaleido # ✅ 稳定安装步骤手册第 132 页验证过 pip install --upgrade pip pip install kaleido --no-cache-dir # 若仍失败手动下载 wheel 包官网提供离线包 # https://github.com/plotly/Kaleido/releases # 下载 kaleido-0.2.1-py3-none-win_amd64.whl pip install kaleido-0.2.1-py3-none-win_amd64.whl提示kaleido依赖系统级字体。若导出中文乱码需在代码中指定字体fig.update_layout( fontdict(familySimHei, Microsoft YaHei, sans-serif) )5. 避坑数据清洗与可视化中五个让你加班到凌晨的真实问题5.1 现象pd.read_excel()读取 .xlsx 文件时数字列变成科学计数法字符串如1.23E08原因Excel 单元格格式为“常规”pandas 读取时按字符串解析未触发数值转换。解决强制指定dtype或用converters转换# 方案1读取后批量转换适合已知列名 df[id] pd.to_numeric(df[id], errorscoerce) # errorscoerce 将非法值转为NaN # 方案2读取时转换推荐 df pd.read_excel(data.xlsx, converters{id: str}) # 强制为字符串避免科学计数法5.2 现象sns.heatmap()报错TypeError: ufunc isnan not supported for the input types原因数据包含非数值类型如字符串N/A或object类型列heatmap无法计算相关性。解决清洗数据并指定vmin/vmax# 清洗只保留数值列 numeric_df df.select_dtypes(include[number]).dropna() # 绘图时显式设置数值范围避免自动计算出错 sns.heatmap( numeric_df.corr(), vmin-1, vmax1, # 强制范围防止NaN传播 annotTrue, cmapcoolwarm )5.3 现象plt.savefig()保存的 PNG 图中中文标题显示为方块原因Matplotlib 默认字体不支持中文且未配置中文字体路径。解决全局设置字体一次配置全程生效import matplotlib matplotlib.rcParams[font.sans-serif] [SimHei, Arial Unicode MS, DejaVu Sans] matplotlib.rcParams[axes.unicode_minus] False # 解决负号-显示为方块的问题 # 验证是否生效 plt.figure() plt.title(中文标题测试) plt.text(0.5, 0.5, 测试文字, fontsize12) plt.show() # 应正常显示5.4 现象plotly.express图表在 Jupyter 中显示正常导出 HTML 后交互失效原因write_html()默认include_plotlyjscdn但内网环境无法访问外网 CDN。解决改用本地 JS 或完整嵌入# 方案1下载离线 plotly.js推荐 # 1. 访问 https://cdn.plot.ly/plotly-latest.min.js 下载 # 2. 保存为 plotly.min.js 到项目目录 fig.write_html( chart.html, include_plotlyjsplotly.min.js, # 指向本地文件 full_htmlTrue ) # 方案2完全嵌入文件大但绝对可靠 fig.write_html(chart_full.html, include_plotlyjsTrue)5.5 现象df.groupby().agg()聚合后多级索引列名丢失reset_index()报错原因agg()返回MultiIndexreset_index()需指定level或col_level。解决显式命名聚合列并展平# 错误直接 reset_index() # result df.groupby(region).agg({revenue: sum, cost: mean}).reset_index() # 正确先命名列再展平 result df.groupby(region).agg( total_revenue(revenue, sum), avg_cost(cost, mean) ).reset_index() # 此时列名为 [region, total_revenue, avg_cost]6. 进阶技巧用pandas-profiling自动生成数据质量报告并嵌入可视化流程6.1 为什么人工写数据校验脚本不如自动生成报告你花 2 小时写的check_null_ratio()、check_date_range()、check_outliers()可能漏掉ID 列的重复率突增或金额列的分布偏移。pandas-profiling现名ydata-profiling能一键扫描全部维度# 安装注意新版已更名为 ydata-profiling pip install ydata-profiling # 生成报告耗时取决于数据量但值得 from ydata_profiling import ProfileReport import pandas as pd df pd.read_csv(sales_q3.csv) profile ProfileReport( df, titleSales Q3 Data Quality Report, explorativeTrue, # 启用探索性分析如相关性热力图 minimalFalse, # 关闭minimal模式获取完整报告 correlations{ pearson: {calculate: True}, spearman: {calculate: True}, kendall: {calculate: True}, phi_k: {calculate: True}, cramers: {calculate: True} } ) profile.to_file(sales_q3_report.html)报告包含缺失值矩阵、数值分布直方图、类别频率条形图、字段间相关性热力图、异常值检测基于 IQR、时间序列趋势若含日期列。最关键是“Warnings” 标签页自动标出region 列唯一值仅5个但出现12次空值、revenue 列有0.3%负值可能为退款等业务风险点。6.2 将 Profiling 报告嵌入你的可视化流水线不要把报告当一次性产物。手册第 156 页给出工程化集成方案用profile.get_description()提取关键指标注入到你的主图表中# 提取 Profiling 报告中的关键数据质量指标 desc profile.get_description() quality_metrics { total_rows: desc[table][n_observations], missing_cells_pct: desc[table][n_cells_missing] / (desc[table][n_observations] * desc[table][n_variables]) * 100, duplicate_rows_pct: desc[table][n_duplicates] / desc[table][n_observations] * 100, numeric_columns: len([c for c in desc[variables] if desc[variables][c][type] Numeric]), high_cardinality_cols: [c for c in desc[variables] if desc[variables][c].get(n_distinct, 0) 1000] } # 在主图表标题中动态显示数据质量 plt.figure(figsize(12, 6)) sns.lineplot(datadf, xdate, yrevenue) plt.title( fRevenue Trend (Q3) | Data Quality: {quality_metrics[missing_cells_pct]:.1f}% missing, f{quality_metrics[duplicate_rows_pct]:.1f}% duplicates, fontsize12 ) plt.show()这样每次运行可视化脚本标题都会实时反映当前数据健康度。业务方一眼看到“缺失率 12.3%”就知道结论需谨慎采信。6.3 用profile.to_widgets()在 Jupyter 中实现交互式探查在开发阶段profile.to_notebook_iframe()可直接在 notebook 中渲染完整报告支持点击钻取# 在 Jupyter cell 中运行 profile.to_notebook_iframe() # 效果右侧弹出完整报告界面可点击任意字段查看详细分布 # 点击 revenue → 查看直方图、统计摘要、异常值列表 # 点击 region → 查看各区域占比、空值分布这比反复写df[revenue].describe()、df[region].value_counts()高效十倍。我一般在清洗前先跑一遍profile根据 “Warnings” 列表定向写清洗逻辑而不是盲目fillna(0)。从那以后我每次启动分析任务都强制先跑ProfileReport生成 HTML 报告并把missing_cells_pct和duplicate_rows_pct两个指标写进脚本日志——这成了我的数据质量“后悔药”只要报告里这两个数字突增立刻回溯上游数据源而不是在可视化环节死磕为什么图表看起来怪怪的。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Python数据分析实战手稿:脏数据清洗到可交付图表的四步闭环 简介:本资源是一份面向Python初学者与数据分析入门者的系统性学习指南,聚焦数据处理与可视化核心能力培养,适用于高校学生、转行新人及需快速上手业务分析的职场人员。文档以PDF格式呈现,共1个文件,大小仅114KB&#x… · 2026/11/8 23:38:18
VSCode C++环境配置:编译器、PATH与三个JSON排错指南 简介:面向 VSCode 初学者与需要搭建 C/C 开发环境的学生、开发者,这套资料围绕编辑器基本使用与 C/C 工具链配置展开,重点解决界面不熟、插件选择混乱、编译调试配置繁琐等入门痛点,适合零基础入门与进阶前巩固,也可作… · 2026/11/6 13:15:16
Linux实战100例:环境搭建、命令组合与Shell脚本避坑 简介:这份资料围绕 Linux 实际应用场景整理了实例型资料包,面向已具备基础命令操作、希望进一步提升排障与配置能力的学习者与运维人员。内容以 100 个代表性实例为主线,覆盖网络调用命令的使用方式、Apache 服务参数配置详解、Linux 错误代码… · 2026/11/4 11:36:48
工程没有电工证能干吗 怎么考值不值得考 工程没有电工证能干吗 怎么考值不值得考 实操考试心里没底怕挂科,这是很多准备考电工证的工程人最真实的心理写照。你不是一个人,很多人在报名前都经历过这样的纠结: 工程没有电工证能干吗… · 2026/11/10 22:42:31
中级电工证给多少补贴在哪考才靠谱别被坑 中级电工证给多少补贴在哪考才靠谱别被坑 实操考试心里没底怕挂科?中级电工证给多少补贴在哪考才靠谱?很多人在准备考取中级电工证时,最关心的就是补贴金额和在哪里考才最稳妥。其实,了解清楚这些信息,不仅能帮你少走弯路,还能为未来职业发展打下坚实基… · 2026/11/10 22:42:31
浙江低压电工证复训怎么弄?学历不高怕报不上名,电子证书怎么拿? 浙江低压电工证复训怎么弄?学历不高怕报不上名,电子证书怎么拿? 你是不是也觉得,学历不高,怕报不了名?其实不是的, 浙江低压电工证复训 对学历要求并不高,关键是你有没有真正掌握这门技术。而且,现在 电子证书… · 2026/11/10 22:42:31
南宁电工证体检包过怎么操作?学历不高怕报不上名?上岗必备技巧全解析 南宁电工证体检包过怎么操作?学历不高怕报不上名?上岗必备技巧全解析 你是不是因为学历不高,担心自己拿不到电工证?别急,南宁电工证体检包过其实并没有想象中那么难,关键是要掌握方法。今天我们就从【上岗必备】的角度,手把手教你怎么搞定南宁电工证体… · 2026/11/10 22:42:31
电工作业考证条件要求含金量到底高不高?实操考试心里没底怕挂科 电工作业考证条件要求含金量到底高不高?实操考试心里没底怕挂科 你不是一个人,实操考试心里没底怕挂科,这种焦虑很多人都有,尤其是第一次报考电工证的朋友。别慌,本文从郑州金水区项目现场管理员的实际经验出发,带你一步步看懂电工作业考证条件要求,搞… · 2026/11/10 22:42:31
乐陵市学习电工证在哪?学历不高怕报不上名?费用全公开 乐陵市学习电工证在哪?学历不高怕报不上名?费用全公开 你是不是觉得学历不高就考不了电工证?其实不然,很多在一线工作的电工,学历并不高,照样能考取电工证上岗工作。 乐陵市学习电工证在哪 ? 多少钱… · 2026/11/10 22:41:29
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43
丹寨电工证怎么考?内部消息透露报考条件和流程 丹寨电工证怎么考?内部消息透露报考条件和流程 急需特种作业证才能上岗找工作,这是很多电工朋友最真实的焦虑。尤其是像丹寨电工证这样的证书,直接影响你的职业发展和薪资待遇。但你知道吗?很多人都在报考过程中踩坑,有的甚至花了几千块最后白忙一场。今… · 2026/11/10 0:00:13
成都建筑电工证办理郑州报考避坑指南 成都建筑电工证办理郑州报考避坑指南 证书过期了不知道怎么复审延期?别慌!这篇文章手把手带你解决成都建筑电工证办理的难题,顺便避掉郑州报考的那些坑。不管你是刚拿到证的新手,还是准备复审的老电工,这波干货都别错过。… · 2026/11/10 0:00:13
梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程 梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程 你是不是正为梅州低压电工证发愁?不知道去哪报名,怕被中介骗钱,又担心证书是不是全国通用?其实,这些顾虑都是正常人会有的。今天我就从一个在开封房建工程一线干了几年的电工角度,手把手教你… · 2026/11/10 0:00:13
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47