跳转到主要内容
尽管 DataStore 与 pandas 高度兼容,但两者之间仍有一些重要差异需要了解。

摘要表


1. 惰性与立即执行

pandas (立即)

操作会立即执行:

DataStore (惰性)

仅在需要结果时才会执行操作:

为什么这很重要

惰性执行可带来:
  • 查询优化:多个操作会编译成一条 SQL 查询
  • 列裁剪:仅读取所需的列
  • 过滤器下推:过滤器会在源端生效
  • 内存效率:避免加载不需要的数据

2. 返回类型

pandas

DataStore

转换为 pandas 数据类型


3. 执行触发器

DataStore 会在需要实际值时执行:

保持惰性执行的操作


4. 行的顺序

pandas

始终保留行顺序:

DataStore

对于大多数操作,会自动保留行顺序:
DataStore 会在内部自动记录原始行的位置 (使用 rowNumberInAllBlocks()) ,以确保顺序与 pandas 保持一致。

何时会保留行顺序

  • 文件源 (CSV、Parquet、JSON 等)
  • pandas DataFrame 源
  • 过滤操作
  • 列选择
  • 显式调用 sort() 或 sort_values() 之后
  • 会确定顺序的操作 (nlargest()、nsmallest()、head()、tail())

顺序何时可能发生变化

  • 在 groupby() 聚合之后 (使用 sort_values() 可确保顺序一致)
  • 使用某些 join type 进行 merge() / join() 之后
  • 在 性能模式 (config.use_performance_mode()) 下:任何操作的行顺序都无法保证。请参见性能模式。

5. 没有 inplace 参数

pandas

DataStore

不支持 inplace=True。请始终将结果赋值给变量:

为什么没有 inplace?

DataStore 使用不可变操作,以便实现:
  • 查询构建 (惰性求值)
  • 线程安全
  • 更容易调试
  • 更简洁的代码

6. 索引支持

pandas

完整的索引支持:

DataStore

简化了对索引的支持:

DataStore 的数据来源很重要

  • DataFrame 来源:保留 pandas 索引
  • File 来源:使用简单的整数索引

7. 比较行为

与 pandas 对比

pandas 无法识别 DataStore 对象:

使用 equals()


8. 类型推断

pandas

使用 numpy/pandas 数据类型:

DataStore

可使用 ClickHouse 类型:

显式类型转换


9. 内存模型

pandas

所有数据都存储在内存中:

DataStore

数据会一直保留在源端,直到需要时才使用:

10. 错误信息

不同的错误来源

  • pandas 错误:来自 pandas 库
  • DataStore 错误:来自 chDB 或 ClickHouse

调试技巧


迁移清单

从 pandas 迁移时:
  • 修改 import 语句
  • 移除 inplace=True 参数
  • 在需要 pandas DataFrame 的地方显式添加 to_df()
  • 如果行顺序很重要,请添加排序
  • 使用 to_pandas() 进行对比测试
  • 使用具有代表性的数据规模进行测试

快速参考