跳转到主要内容
虽然 DataStore 与 pandas 高度兼容,但仍有一些需要了解的重要差异。

总结表


1. 惰性执行 vs 立即执行

pandas (立即执行)

操作会立即执行:

DataStore (惰性)

操作会延迟到需要结果时才执行:

为什么这很重要

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

2. 返回类型

pandas

DataStore

转换为 pandas 数据类型


3. 执行触发条件

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

保持惰性执行的操作


4. 行顺序

pandas

行顺序始终保持不变:

DataStore

在大多数操作中,行顺序都会自动保留
DataStore 会自动在内部跟踪原始行位置 (使用 rowNumberInAllBlocks()) ,以确保顺序与 pandas 一致。

保留顺序的情况

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

顺序可能不同的情况

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

5. 不支持 inplace 参数

pandas

DataStore

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

为什么不支持 inplace?

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

6. 索引支持

pandas

全面支持索引:

DataStore

简化的索引支持:

DataStore 来源很关键

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

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() 进行对比测试
  • 使用具有代表性的数据规模进行测试

快速参考

最后修改于 2026年6月29日