ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

VisiData 分组与统计聚合实战指南:Frequency Table、Pivot Table 与 Describe Sheet 的完整用法

VisiData 分组与统计聚合实战指南:Frequency Table、Pivot Table 与 Describe Sheet 的完整用法 数据分析CLI数据可视化【免费下载链接】visidataA terminal spreadsheet multitool for discovering and arranging data项目地址https://gitcode.com/gh_mirrors/vi/visidata点击查看免费下载导读本指南以 VisiData 官方文档 docs/group.md 为骨架系统讲解终端表格工具 VisiData 中分组数据 描述性统计的完整工作流如何为单列设置统计聚合器aggregator、如何通过 Frequency Table频数表、Pivot Table透视表与 Describe Sheet描述表三种分组视图回答每种商品卖了多少每月营收是多少这类问题以及如何把聚合结果过滤、回灌到源表。读完本文你将掌握/z聚合命令、聚合条的显示逻辑以及ShiftF、ShiftW、ShiftI三个核心分组命令的实战套路并理解这些功能在源码层visidata/aggregators.py、visidata/freqtbl.py、visidata/pivot.py、visidata/features/describe.py的实现原理。适用版本文档标注为 VisiData 1.3.1 时代撰写但聚合器、Frequency/Pivot/Describe 的命令与工作机制在当前仓库中仍然完整保留并可复现。本文示例数据使用仓库自带的 sample_data/sample.tsv首行表头为OrderDate Region Rep Item Units Unit_Cost Total。为单列设置统计聚合器聚合器aggregator为分好组的多行数据提供汇总统计量是 VisiData 一切分组视图频数表、透视表、描述表的计算基础。VisiData 通过两条命令把聚合器挂到列上命令操作聚合器名把指定聚合器添加到当前列此后该列在分组视图中会被汇总z聚合器名在状态栏即时显示该聚合器对当前列选中行的计算结果一次性查看不持久其中z对应源码中的memo-aggregate命令visidata/aggregators.py它把聚合结果同时写入状态栏与 VisiData 内存vd.memory[列名_聚合器名]方便后续在表达式中引用。会弹出聚合器选择面板chooseAggregators支持用空格同时输入多个聚合器名称visidata/aggregators.py添加后列上会记录一个以空格分隔的aggstr属性聚合器集合也可以通过 Columns SheetShiftC中名为aggregators的列直接查看和修改visidata/aggregators.py。内置聚合器清单以下聚合器在 visidata/aggregators.py 与 visidata/guides/AggregatorsSheet.md 中均有定义可直接用添加聚合器说明min组内最小值max组内最大值avg/mean组内算术平均值同一函数mean为别名mode组内出现频率最高的值median组内中位数q3/q4/q5/q10向组内添加分位数聚合器例如q4会生成 p25、p50、p75 三个分位列sum组内所有数值的总和distinct组内不同值的个数count组内值的个数keymax组内最大值所在行的键key column 的值list把列中的值收集成一个列表列表聚合器stdev值的标准差此外还有keymin最小值所在行的键、q3/q4/q5/q10展开后的各百分位聚合器p10…p99以及p25/p50/p75等可直接使用的百分位聚合器visidata/aggregators.py。avg与stdev的聚合结果类型强制为数值类型distinct/count强制为整数类型其余默认沿用源列类型。如何扩展自定义聚合器聚合器注册机制vd.aggregator(name, funcValues, helpstr, type...)是开放的funcValues接收一个类型化后的值列表并返回聚合结果。在~/.visidatarc配置中加入下面一行即可得到一个新的range聚合器组内最大值减最小值vd.aggregator(range, lambda values: max(values) - min(values), range of values)实现细节见 visidata/aggregators.py下次启动 VisiData 后该聚合器即可用添加。需要注意普通聚合器面向整组返回单一值而list这类列表聚合器继承自ListAggregator逐行返回一个值visidata/aggregators.py下文合并单元格一节正是利用了这一特性。聚合条分组统计的实时展示当某一列挂上聚合器后工作表底部会出现聚合条aggregation bar每个聚合器独占一行显示聚合器名称以及每个挂了该聚合器的列所计算出的数值docs/group.md 中Aggregation bar一节。聚合值基于源表全部行异步计算asyncthreadmemo缓存见 visidata/aggregators.py不会阻塞交互计算过程中的值显示为进行中状态异常值如stdev遇到单元素组抛出的StatisticsError会以错误串形式展示在聚合行内而非让整个界面崩溃。聚合条的渲染实现在 visidata/sheets.py遍历allAggregators为每个聚合器绘制一行行高不够时标签会自动挪到第一个没有聚合器的列上。其配色由color_aggregator选项控制默认值为bold 255 white on 240 blackvisidata/sheets.py可在 Options SheetShiftO中修改。用 Frequency Table频数表做分组统计Frequency Table 是 Visidata 对 SQLGROUP BY的终端实现按指定列的取值把源行分箱bin并为挂了聚合器的其他列生成汇总列。对应的 sheet 类是FreqTableSheet源码见 visidata/freqtbl.py。快速回答每种商品卖了多少以 sample_data/sample.tsv 为例把光标移到Item列按ShiftF打开Frequency Table。结果表中每一行是一个分组binItem列显示分组键附带的count列显示该组源行数、percent列显示占比、histogram列用色块字符默认■由disp_histogram选项控制画出相对数量。若分组列全部非数值频数表默认按count倒序排列visidata/freqtbl.py。ShiftF只按光标所在列分组等价命令freq-col若已设置多个键列可用gFfreq-keys按全部键列联合分组zFfreq-summary则生成一个全表 vs 选中行的汇总行visidata/freqtbl.py。命令的完整定义也记录在 visidata/man/vd.inc 的 Frequency Table 一节。回答每月营收是多少聚合器 正则拆分列 频数表这是文档中最完整的组合案例完整步骤为在OrderDate列上输入;后跟正则(\d-\d)用捕获组新建一个只含年-月的列OrderDate_re0按-隐藏OrderDate列在OrderDate_re0列输入^后跟OrderDate重命名在Total列按$设为货币类型输入后跟sum给Total添加求和聚合器在OrderDate列按ShiftF打开Frequency Table此时会按月份分组在OrderDate列按[把表按时间先后排序在sum_Total列输入^后跟Revenue重命名。最终得到的频数表即月度营收表Revenue列来自Total列的sum聚合器。注意第 4 步的类型设置很关键——添加聚合器之前先让目标列具备正确的数值类型#int、%float、$currency、date聚合结果才会按数值而非文本计算visidata/guides/FrequencyTable.md 也特别提示要设置合适的列类型。频数表的聚合列从哪来聚合列并非在打开频数表时才计算而是源表列上已挂的聚合器被带入分组视图FreqTableSheet.loader()通过addAggregateCols()与groupRows()两个并行任务构建分组与汇总列visidata/freqtbl.py。分组键、分组名、组内源行分别存放在PivotGroupRow的discrete_keys、numeric_key、sourcerows字段visidata/pivot.py。如果源表列没有任何聚合器频数表就只有count/percent/histogram三类默认列一旦出现聚合列percent与histogram列会自动隐藏visidata/freqtbl.py。用 Pivot Table透视表做交叉分组透视表在频数表基础上增加透视列行方向按键列分组列方向按某个分类列的每个不同取值展开形成二维交叉汇总。标准操作流程对应文档步骤把光标移到自变量列 A按!把它标记为键列key column作为分组依据把光标移到数值列 B按添加聚合器如sum该聚合器会作用于每个分组确保 B 列类型为数值类型#int、%float、$currency或date把光标移到作为因变量的分类列 C按ShiftWpivot进行透视。生成的透视表中每个分组行对应一个键值组合每个透视列对应 C 列的一个不同取值单元格值为聚合器在该 (组, 取值) 子集上的结果。源码层由makePivot/PivotSheet实现visidata/pivot.py命令注册在 visidata/pivot.pyShiftWmakePivot(sheet, keyCols, [cursorCol])即行 全部键列列 光标所在列。透视表命名与默认行为若源表没有任何聚合器但指定了透视列透视表会对透视列自动使用count聚合器兜底visidata/pivot.py单透视列时透视列名直接取不同取值多透视列时前缀列名_多聚合器或多聚合列时列名进一步拼接为聚合名_取值visidata/pivot.py打开--numeric-binning选项后数值型分组列会被切成区间如0-10、10-20区间数由histogram_bins决定未设置时取sqrt(nRows)visidata/pivot.py。文档对应章节还附带了一段 asciinema 演示录像源码位于 docs/casts/pivot.cast可按需--play回放学习。用 Describe Sheet描述表查看描述性统计ShiftIdescribe-sheet一次性为源表所有可见列生成一张每列一行的描述表visidata/features/describe.py。默认展示的统计列包括errors出错单元格数、nulls空值数、distinct不同值个数、mode众数、min、max、sum、median再加上describe_aggrs选项指定的数值聚合器默认值为mean stdevvisidata/features/describe.py可通过-d describe_aggrsmean stdev median等命令行方式追加。gIdescribe-all则对所有已入栈 sheet的所有可见列生成描述表visidata/features/describe.py。描述表本身是一个ColumnsSheet每行的源列信息记录在sheet列中因此可以直接在描述表上做跳转、选择等后续操作。把分组/聚合结果过滤回源表分组视图与源表之间是双向可通的这是 VisiData 分组工作流最实用的一环。按频数表分组筛选方式一多组ShiftF打开Frequency Table在感兴趣的分组上按s或t选中这些组——频数表会把选中同步到源表对应行FreqTableSheet.selectRow会逐个调用source.selectRow见 visidata/freqtbl.py按q或Ctrl^返回源表按打开一个只含选中行的副本 sheet。方式二单组ShiftF打开Frequency Table在感兴趣的分组上按Enter直接打开一个只含该组源行的副本 sheet对应openRowvisidata/freqtbl.py。此外gEnter打开所有选中组对应的源行副本、zEnter打开排除当前组后的源行副本、gzEnter排除所有选中组visidata/freqtbl.pygu反选当前组对应的源行。按ShiftZ开启分屏后再ShiftF频数表会自动出现在另一个分屏中方便边看分组边看源表visidata/guides/FrequencyTable.md。按描述表筛选ShiftI打开Describe Sheet在感兴趣的描述单元格上按zs选中源表中被该单元格描述的行q或Ctrl^返回源表按打开选中行副本。或更直接在描述单元格上按zEnter打开一个只含当前单元格所描述行的源表副本对应openCellvisidata/features/describe.pyzs命令注册于 visidata/features/describe.py。按透视表聚合结果筛选在Pivot Table中Enter打开当前透视行聚合的所有源行副本zEnter打开当前透视单元格聚合的源行副本visidata/pivot.py。实战把一列的多行值合并进单行单元格文档最后给出一个经典的长表转宽表玩法把field value A 1 A 2 B 3 C 4 C 5变成field value A 1;2 B 3 C 4;5操作步骤在value列输入后跟list添加列表聚合器在field列按ShiftF打开Frequency Table此时每个 field 值一组组内 value 被收集为列表在频数表上输入后跟;.join(value_list)添加一个表达式列把列表 join 成字符串。原理在于list是一个ListAggregator它不把整组归约成单值而是把组内各行的类型化值组装成列表visidata/aggregators.py从而让;.join(value_list)这类 Python 表达式可以逐组计算。类似的合并思路也可推广到,、|等任意分隔符。附与本主题直接相关的仓库资源聚合器注册与内置实现visidata/aggregators.py频数表实现与命令visidata/freqtbl.py透视表实现与命令visidata/pivot.py描述表实现与命令visidata/features/describe.py聚合条渲染与color_aggregator选项visidata/sheets.py内置帮助man 页中的 Frequency/Pivot 命令定义visidata/man/vd.inc交互式速查指南visidata/guides/FrequencyTable.md、visidata/guides/AggregatorsSheet.md可直接运行验证的数据与测试示例数据 sample_data/sample.tsv自动化回归测试 tests/freq-summary.vd、tests/pivot.vdj对应 golden 文件 tests/golden/freq-summary.tsv、tests/golden/pivot.tsv以及 visidata/features/rank.py 中基于aggregate_groups的分组排名功能visidata/aggregators.py。小结VisiData 的分组统计体系可以概括为一句话先用在列上挂聚合器再用ShiftF频数表、ShiftW透视表、ShiftI描述表三种视图从不同角度消费这些聚合器最后用Enter/zEnter/s/t/zs把分组结果一键钻取回源表继续加工。聚合器、分组表与源表之间的双向联动加上list列表聚合器带来的逐组行级处理能力使得许多原本需要写脚本完成的数据整理工作可以直接在终端内交互完成。赞分享数据分析CLI数据可视化【免费下载链接】visidataA terminal spreadsheet multitool for discovering and arranging data项目地址https://gitcode.com/gh_mirrors/vi/visidata点击查看免费下载相关推荐TanStack Table Lit 聚合Aggregation实战指南行级分组无关的合计与分组聚合TanStack Table Lit 聚合Aggregation实战指南行级分组无关的合计与分组聚合 导读 本指南聚焦 TanStack Table 的前端UI组件Solid Table 聚合Aggregation功能实战指南总计、分组聚合与自定义聚合函数Solid Table 聚合Aggregation功能实战指南总计、分组聚合与自定义聚合函数 本指南基于 TanStack TableSolid 适配层前端UI组件TanStack TablePreact聚合指南行聚合、分组聚合与自定义聚合函数实战TanStack TablePreact聚合指南行聚合、分组聚合与自定义聚合函数实战 本文以 TanStack Table 的 Preact 适配器 t前端UI组件上一篇如何将微信聊天记录变成你的个人AI训练数据库完全本地化解决方案下一篇3个核心模块打造你的专属Obsidian从简约到惊艳的美化完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表