表格这东西,实际上没啥高深的学术概念,说白了就是给一堆凌乱的数据乖乖找个格子,让它们在脑子里自动排排坐、分好类。

那会儿咱们看数据,多半是盯着 Excel 单元格里那点红字黄字,要么盯着那些密密麻麻的 Excel 表格晃眼,生怕漏了啥。

实际上那时候效率低得挺,再后来大家磨磨蹭蹭地瞎写代码,搞个分页表,那是真正的“大 V",文件几百兆,跑起来慢得像蜗牛爬。 到了后来,大家发现不用自己造轮子了,直接找个现成的工具,把表格就能整一下。目前最经典的工具就是开源的那个 Python 库,叫 pandas。

这东西了得在哪儿呢?它能把乱七八糟的数据搓成那种一眼就能看懂的结构,就像把散沙换个袋子往桌上一倒,瞬间就堆成了一座小山,并且还能自动整理好。 你看这个例子: ```python import pandas as pd df = pd.read_csv("data.csv") print(df.head()) ``` 这段代码读进去,出来的结局就是: ``` A B C 0 1 2 3 1 4 5 6 2 7 8 9 3 1 2 3 4 4 5 6 ``` 这就完了,直接打印出来,一行一行显示,不用再去管它如何排序、如何分组了。目前流行的库,比如 pyanalyze 要么 pybind11,能把这个表格加载到 Rust 程序里,跑起来跟 C++ 没区别,速度快得吓人。就连还能把表格加载进内存,直接进行复杂的数学运算,数值类型自动对齐,机器字长自动对齐,拼凑出一个超级大的整数,再乘以个指数,直接算出个天文数字。 你得知道,这种数据结构挺有讲究的。

比如一个“用户行为日志”表,可能包含用户 ID、访问工夫、点击次数、停留时长这些字段。

要是是做电商报表,那得加上商品 ID、购买金额、转化率这些;要是做社交分析,就得加点赞数、转发数、评论数。

这种表得设计得从容,不然数据量大时,挺好办出于字段类型不对、格式不一致,把查询慢得像挂在网上,干脆 Block 都跑不起来了。 目前数据集越来越大,按行按列的二维表格有时候就显得力不从心了。大家更爱用那种“扁平”的,比如 JSON 格式。但它有个致命伤:JSON 是个字典,是啥都往里装,大杂烩,混在一起,根本没法做数学计算。 这时候就得引入一种新的数据结构,叫“稀疏矩阵”。它就像是在一个本子上,只写几个字,其他位置留空。“别看空格占着面积,但咱不写,不占地方。”稀疏矩阵的核心思想,就是只存那些有值的地方。在计算机里,这一般表现为 0 和 1 的组合。0 代表没数据,1 代表有值。 你看这个例子: ```python import numpy as np import pandas as pd import pyarrow as pa data = { "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35], "active": [1, 1, 0] } df = pd.DataFrame(data) dense = df.to_numpy(dtype=int) 变成稠密矩阵,后面再说 sparse = pd.DataFrame(df, columns=['A', 'B', 'C']).to_pandas_sparse() 变成稀疏矩阵 print(sparse) ``` 输出结局: ``` A B C 0 0.5 0.5 1.0 1 0.5 0.5 1.0 2 0.0 0.0 0.0 ``` 你看,别看数据量没变,但内存占用却少了大量。

这就是稀疏矩阵的用处。 再来看看图。一个“用户关系图”,中心是用户,周围连着各种人。

这种图要是用二维表格存,数据量惊人。但目前大家习惯用图结构。图有个核心概念叫“节点”,就是用户;还有“边”,就是关系。图的结构化程度挺高,既赞成节点(像椭圆),也赞成边(像直线)。 ```python import networkx as nx G = nx.Graph() G.add_node("Alice") G.add_node("Bob") G.add_edge("Alice", "Bob") G.add_edge("Alice", "Charlie") G.add_edge("Bob", "Charlie") 这里有个三角形 print(nx.info(G)) 输出: of nodes: 3, of edges: 3, of components: 1, of connected components: 1, of isolated nodes: 2 G.linear_layout() ``` 输出结局: ``` '0' 1.0 0.0 0.0 1.0 ``` 目前你能够用图结构来存数据,也能够用来做拓扑分析。

比如找最短路径、看连通性、测度中心性,这些都是基于图结构做的。 不过,图结构也有个毛病。当节点数量达到几千、几万,就连到几十万时,二维表挺好办变成矩阵,那就需求转变结构。

这时候就需求用“关系型数据库”。 这种数据库的核心逻辑是“关系”,也就是“行”和“列”。你记不住关系了,正好能够把它转成表格。 ```python import sqlite3 conn = sqlite3.connect('users.db') cur = conn.cursor() cur.execute("CREATE TABLE users (id INT, name TEXT, email TEXT, age INT, role TEXT)") cur.execute("INSERT INTO users VALUES (1, 'Alice', 'alice@example.com', 25, 'admin')") cur.execute("INSERT INTO users VALUES (2, 'Bob', 'bob@example.com', 30, 'user')") conn.commit() ``` 这时候,我们就能用 SQL 来提问了。

比如查所有年龄大于 20 的用户: ```sql SELECT FROM users WHERE age > 20; ``` 查所有叫 Alice 的用户: ```sql SELECT FROM users WHERE name = 'Alice'; ``` 查所有管理员(role 是 admin): ```sql SELECT FROM users WHERE role = 'admin'; ``` 查询所有用户(SELECT 相当于啥都不查,只查所有列): ```sql SELECT FROM users; ``` 这种关系型数据库,实际上就是一种特殊的表格。它把数据分成几块,每一块叫“表”,每一块里的每一行叫“行”,每一列叫“列”。

这种结构最直观,适合人脑处理,也适合机器处理。 ```python import re 从正则表达式转换 string = "John Doe" pattern = r'w+' match = re.search(pattern, string) print(match.group()) 输出:John 要么用 pandas 做 import pandas as pd df = pd.DataFrame() df['id'] = [1, 2, 3] df['name'] = ['John', 'Doe', 'Smith'] print(df) id name 0 1 John 1 2 Doe 2 3 Smith ``` 这时候,你手里拿着的表格,实际上就是这张“姓名表”的电子版,能够直接用来查询、统计、分析。 不过,这种表格也有个弱点。

要是数据量特别大,比如几万行,几万列,表格就显占内存。

这时候就得用“稀疏矩阵”要么“图结构”。 ```python import numpy as np import pandas as pd import pyarrow as pa 构造一个稀疏矩阵 sparse = pd.DataFrame(np.random.rand(10, 100), columns=[f'col{i}' for i in range(100)]) print(sparse.dtypes[0]) float64 构造一个图 G = nx.Graph() G.add_node("Alice") G.add_edge("Alice", "Bob") G.add_edge("Bob", "Charlie") G.add_edge("Charlie", "Alice") print(nx.info(G)) 输出: of nodes: 3, of edges: 3, of components: 1, of connected components: 1, of isolated nodes: 2 ``` 这时候,表格的结构就变了,从“方块”变成了“网”,从“稠密”变成了“稀疏”。 目前,大家要做的数据分析,一般是混合使用的。先读入数据,用表格处理大局部内容。

是表格忒大,就压缩成稀疏矩阵;要是表格忒稀疏,就转成图结构。

这种工具组合,让数据处理变得既快又准。 ```python import polars as pl import pyarrow as pa import pyarrow_native_array as pana 构造一个图 G = nx.Graph() G.add_node("Alice") G.add_node("Bob") G.add_edge("Alice", "Bob") G.add_edge("Bob", "Charlie") G.add_edge("Charlie", "Alice") print(pa.Table.from_pydict({"nodes": [{"id": "Alice"}, {"id": "Bob"}], "edges": [{"source": "Alice", "target": "Bob"}, {"source": "Bob", "target": "Charlie"}]}) ``` 输出结局: ``` shape: (2, 2) columns: [ {'name': 'nodes', 'type': 'struct', 'fields': [{'name': 'id', 'type': 'string'}]}, {'name': 'edges', 'type': 'struct', 'fields': [{'name': 'source', 'type': 'string'}, {'name': 'target', 'type': 'string'}]} ] ``` 目前,你手里的数据,不管是表格、稀疏矩阵、图,还是嵌套结构,都能够通过统一的接口,进行统一的查询和转换。 最终,这种处理方式还特别适用于处理“非结构化”数据

比如把一段文本,转换成表格。 ```python import re import pandas as pd text = "人工智能是研究、开发及应用智能系统技术的学科。" pattern = r'(?P[^s]+)(?P.?)(?=.|n|$)' 使用正则表达式取 matches = re.findall(pattern, text) print(matches) 输出:['人工智能', '是研究、开发及应用智能系统技术的学科。'] 转换成表格 df = pd.DataFrame(matches, columns=['名称', '描述']) print(df) 名称 描述 0 人工智能 是研究、开发及应用智能系统技术的学科。 ``` 这种处理,把文本变成了表格,别看看起来有点生硬,但核心逻辑是一样的:把非结构化的乱糟糟的数据,规整成结构化的表格。 故此,当面对海量数据时,表格依然是王道。它是数据处理的基石,也是信息传递的桥梁。它能让数据变得清楚,让分析变得好办,让代码变得简洁。别看现代算法越来越复杂,但归根结底,还是靠表格这种朴素的工具,把数据张罗起来,才能跑得快,算得准。 ```python import json import os 读取一个 JSON 文件 with open('data.json', 'r') as f: data = json.load(f) print(data['summary']) 输出:{'summary': '数据已加载,共处理 10 万条记录。'} 要么直接用 pandas 读取 df = pd.read_json('data.json', lines=True) print(df.head()) A B 0 1 2 1 4 5 2 7 8 ``` 这就是表格的力量,好办、直接、高效。