[ PROMPT_NODE_27028 ]
pandas_migration
[ SKILL_DOCUMENTATION ]
# Pandas 到 Polars 迁移指南
本指南旨在帮助您从 pandas 迁移到 Polars,提供全面的操作映射和关键差异说明。
## 核心概念差异
### 1. 无索引系统
**Pandas:** 使用基于行的索引系统
python
df.loc[0, "column"]
df.iloc[0:5]
df.set_index("id")
**Polars:** 仅使用整数位置
python
df[0, "column"] # 行位置,列名
df[0:5] # 行切片
# 无 set_index 等价物 - 请改用 group_by
### 2. 内存格式
**Pandas:** 面向行的 NumPy 数组
**Polars:** 列式 Apache Arrow 格式
**影响:**
- Polars 在列操作上更快
- Polars 占用内存更少
- Polars 具有更好的数据共享能力
### 3. 并行化
**Pandas:** 主要为单线程(需要 Dask 实现并行)
**Polars:** 默认使用 Rust 的并发机制进行并行处理
### 4. 惰性求值
**Pandas:** 仅支持 Eager 求值
**Polars:** 同时支持 Eager (DataFrame) 和 Lazy (LazyFrame) 模式,并带有查询优化
### 5. 类型严格性
**Pandas:** 允许静默类型转换
**Polars:** 类型严格,需要显式转换
**示例:**
python
# Pandas: 静默转换为 float
pd_df["int_col"] = [1, 2, None, 4] # dtype: float64
# Polars: 保持为整数并包含空值
pl_df = pl.DataFrame({"int_col": [1, 2, None, 4]}) # dtype: Int64
## 操作映射
### 数据选择
| 操作 | Pandas | Polars |
|-----------|--------|--------|
| 选择列 | `df["col"]` 或 `df.col` | `df.select("col")` 或 `df["col"]` |
| 选择多列 | `df[["a", "b"]]` | `df.select("a", "b")` |
| 按位置选择 | `df.iloc[:, 0:3]` | `df.select(pl.col(df.columns[0:3]))` |
| 按条件选择 | `df[df["age"] > 25]` | `df.filter(pl.col("age") > 25)` |
### 数据过滤
| 操作 | Pandas | Polars |
|-----------|--------|--------|
| 单条件 | `df[df["age"] > 25]` | `df.filter(pl.col("age") > 25)` |
| 多条件 | `df[(df["age"] > 25) & (df["city"] == "NY")]` | `df.filter(pl.col("age") > 25, pl.col("city") == "NY")` |
| Query 方法 | `df.query("age > 25")` | `df.filter(pl.col("age") > 25)` |
| isin | `df[df["city"].isin(["NY", "LA"])]` | `df.filter(pl.col("city").is_in(["NY", "LA"]))` |
| isna | `df[df["value"].isna()]` | `df.filter(pl.col("value").is_null())` |
| notna | `df[df["value"].notna()]` | `df.filter(pl.col("value").is_not_null())` |
### 添加/修改列
| 操作 | Pandas | Polars |
|-----------|--------|--------|
| 添加列 | `