跳到主要内容

DataFrame 数据结构

DataFrame 本质上是一个行、列均带标签的二维表格。每列拥有独立的 dtype(数据类型),而所有列共享同一套行索引。

import pandas as pd

people = pd.DataFrame(
{
"name": pd.Series(["Ada", "Lin"], dtype="string"),
"age": pd.Series([36, pd.NA], dtype="Int64"),
}
)

核心不变量

people.shape
people.columns
people.index
people.dtypes
people.info()

Schema(模式)远不止列名那么简单:列的唯一性、数据类型、单位、缺失值处理以及索引的具体含义,都会直接影响下游逻辑的行为。

列操作与赋值

names = people["name"] # 返回 Series
subset = people[["name", "age"]] # 返回 DataFrame
people = people.assign(adult=people["age"].ge(18))

当对列赋值 Series 时,pandas 会自动按索引对齐。只有在你明确需要按位置对齐,且长度完全匹配时,才应传入数组类对象。

行操作与修改

用一次 .loc 操作完成选择和赋值。下面把 Lin 的 age 改为 34,但不会重新计算 adult:这一列保存的是之前算出的结果,不是会自动更新的公式。因此,Lin 的 adult 仍为缺失值;要更新它,需要用修改后的年龄重新运行前面的 assign 表达式。

people.loc[people["name"].eq("Lin"), "age"] = 34

避免使用 df[mask]["age"] = 34 这种链式赋值。它不仅掩盖了实际被修改的对象,还与 pandas 的 Copy-on-Write(写时复制)机制相冲突。

优先使用返回新对象的转换方法(如 assignrenamedrop),而非散落在各处的 inplace=True 原地修改。重新绑定变量能让数据流水线的各个阶段更易于审查和测试。

适用边界

Pandas 最适合处理能轻松装入内存的表格数据。对于严格的数据模式,应在数据摄入阶段进行校验;若数据量超出内存限制或需分布式处理,应选择专为该执行模型设计的引擎。

参考资料

探索关联打开关联网络