Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

DataStore Pandas 兼容性

DataStore 已实现 209 个 pandas DataFrame 方法,可提供完整的 API 兼容性。您现有的 pandas 代码只需稍作修改即可运行。

兼容性方案

# Typical migration - just change the import
- import pandas as pd
+ from chdb import datastore as pd

# Your code works unchanged
df = pd.read_csv("data.csv")
result = df[df['age'] > 25].groupby('city')['salary'].mean()

关键原则:

  • 已实现全部 209 个 pandas DataFrame 方法
  • 通过惰性求值进行 SQL 优化
  • 自动类型封装 (DataFrame → DataStore,Series → ColumnExpr)
  • 不可变操作 (不支持 inplace=True)

属性和特性

属性 描述 触发执行
shape (行,列) 元组
columns 列名 (索引)
dtypes 列的数据类型
values NumPy 数组
index 行索引
size 元素个数
ndim 维度数
empty DataFrame 是否为空
T 转置
axes 轴列表

示例:

from chdb import datastore as pd

ds = pd.read_csv("data.csv")

print(ds.shape)      # (1000, 5)
print(ds.columns)    # Index(['name', 'age', 'city', 'salary', 'dept'])
print(ds.dtypes)     # name: object, age: int64, ...
print(ds.empty)      # False

索引与选择

方法 描述 示例
df['col'] 选择列 ds['age']
df[['col1', 'col2']] 选择多列 ds[['name', 'age']]
df[condition] 布尔索引 ds[ds['age'] > 25]
df.loc[...] 基于标签的访问 ds.loc[0:10, 'name']
df.iloc[...] 基于整数位置的访问 ds.iloc[0:10, 0:3]
df.at[...] 按标签访问单个值 ds.at[0, 'name']
df.iat[...] 按位置访问单个值 ds.iat[0, 0]
df.head(n) 前 n 行 ds.head(10)
df.tail(n) 后 n 行 ds.tail(10)
df.sample(n) 随机样本 ds.sample(100)
df.select_dtypes() 按 Dtype 选择 ds.select_dtypes(include='number')
df.query() 查询表达式 ds.query('age > 25')
df.where() 条件替换 ds.where(ds['age'] > 0, 0)
df.mask() where 的反向操作 ds.mask(ds['age'] < 0, 0)
df.isin() 值是否属于集合 ds['city'].isin(['NYC', 'LA'])
df.get() 安全访问列 ds.get('col', default=None)
df.xs() 横截面 ds.xs('key')
df.pop() 移除列 ds.pop('col')

统计方法

方法 描述 SQL 等价写法
mean() 均值 AVG()
median() 中位数 MEDIAN()
mode() 众数 -
std() 标准差 STDDEV()
var() 方差 VAR()
min() 最小值 MIN()
max() 最大值 MAX()
sum() 总和 SUM()
prod() 乘积 -
count() 非 NULL 值计数 COUNT()
nunique() 去重计数 UNIQ()
value_counts() 值频率 GROUP BY
quantile() 分位数 QUANTILE()
describe() 描述统计 -
corr() 相关矩阵 CORR()
cov() 协方差矩阵 COV()
corrwith() 两两相关性 -
rank() 值排名 RANK()
abs() 绝对值 ABS()
round() 值取整 ROUND()
clip() 截断值 -
cumsum() 累计和 窗口函数
cumprod() 累计乘积 窗口函数
cummin() 累计最小值 窗口函数
cummax() 累计最大值 窗口函数
diff() 差值 窗口函数
pct_change() 百分比变化 窗口函数
skew() 偏度 SKEW()
kurt() 峰度 KURT()
sem() 标准误 -
all() 全为 true -
any() 任一为 true -
idxmin() 最小值的索引 -
idxmax() 最大值的索引 -

示例:

ds = pd.read_csv("data.csv")

# Basic statistics
print(ds['salary'].mean())
print(ds['age'].std())
print(ds.describe())

# Group statistics
print(ds.groupby('department')['salary'].mean())
print(ds.groupby('city').agg({'salary': ['mean', 'std'], 'age': 'count'}))

数据处理

方法 描述
drop() 删除行/列
drop_duplicates() 删除重复项
duplicated() 标记重复项
dropna() 删除缺失值
fillna() 填充缺失值
ffill() 向前填充
bfill() 向后填充
interpolate() 插值
replace() 替换值
rename() 重命名列/索引
rename_axis() 重命名轴
assign() 添加新列
astype() 转换数据类型
convert_dtypes() 推断数据类型
copy() 复制 DataFrame

示例:

ds = pd.read_csv("data.csv")

# Drop operations
result = ds.drop(columns=['unused_col'])
result = ds.drop_duplicates(subset=['user_id'])
result = ds.dropna(subset=['email'])

# Fill operations
result = ds.fillna(0)
result = ds.fillna({'age': 0, 'name': 'Unknown'})

# Transform operations
result = ds.rename(columns={'old_name': 'new_name'})
result = ds.assign(
    full_name=lambda x: x['first_name'] + ' ' + x['last_name'],
    age_group=lambda x: pd.cut(x['age'], bins=[0, 25, 50, 100])
)

排序与排名

方法 描述
sort_values() 按值排序
sort_index() 按索引排序
nlargest() 最大的前 N 个值
nsmallest() 最小的前 N 个值

示例:

# Sort by single column
result = ds.sort_values('salary', ascending=False)

# Sort by multiple columns
result = ds.sort_values(['department', 'salary'], ascending=[True, False])

# Get top/bottom N
result = ds.nlargest(10, 'salary')
result = ds.nsmallest(5, 'age')

重塑

方法 说明
pivot() 数据透视表
pivot_table() 带聚合的数据透视
melt() 逆透视
stack() 将列堆叠到索引
unstack() 将索引展开为列
transpose() / T 转置
explode() 将列表展开为行
squeeze() 压缩维度
droplevel() 删除索引级别
swaplevel() 交换索引级别
reorder_levels() 重新排列级别

示例:

# Pivot table
result = ds.pivot_table(
    values='amount',
    index='region',
    columns='product',
    aggfunc='sum'
)

# Melt (unpivot)
result = ds.melt(
    id_vars=['name'],
    value_vars=['score1', 'score2', 'score3'],
    var_name='test',
    value_name='score'
)

# Explode arrays
result = ds.explode('tags')

合并 / 连接

方法 描述
merge() SQL 风格合并
join() 按索引连接
concat() 拼接
append() 追加行
combine() 使用函数合并
combine_first() 按优先级合并
update() 更新值
compare() 显示差异

示例:

# Merge (join)
result = pd.merge(df1, df2, on='id', how='left')
result = df1.join(df2, on='id')

# Concatenate
result = pd.concat([df1, df2, df3])
result = pd.concat([df1, df2], axis=1)

二元运算

方法 描述
add() / radd() 加法
sub() / rsub() 减法
mul() / rmul() 乘法
div() / rdiv() 除法
truediv() / rtruediv() 真除
floordiv() / rfloordiv() 整除
mod() / rmod() 取模
pow() / rpow() 幂运算
dot() 矩阵乘法

示例:

# Arithmetic operations
result = ds['col1'].add(ds['col2'])
result = ds['price'].mul(ds['quantity'])

# With fill_value for missing data
result = ds['col1'].add(ds['col2'], fill_value=0)

比较运算

方法 描述
eq() 等于
ne() 不等于
lt() 小于
le() 小于或等于
gt() 大于
ge() 大于或等于
equals() 判断是否相等
compare() 显示差异

函数应用

方法 说明
apply() 应用函数
applymap() 逐元素应用
map() 映射值
agg() / aggregate() 聚合
transform() 转换
pipe() 管道式函数调用
groupby() 分组

示例:

# Apply function
result = ds['name'].apply(lambda x: x.upper())
result = ds.apply(lambda row: row['a'] + row['b'], axis=1)

# Aggregate
result = ds.agg({'col1': 'sum', 'col2': 'mean'})
result = ds.agg(['sum', 'mean', 'std'])

# Pipe
result = (ds
    .pipe(filter_active)
    .pipe(calculate_metrics)
    .pipe(format_output)
)

时间序列

方法 描述
rolling() 滚动窗口
expanding() 扩展窗口
ewm() 指数加权
resample() 对时间序列重新采样
shift() 值移位
asfreq() 转换频率
asof() 截至该时刻的最新值
at_time() 选择指定时间
between_time() 选择时间范围
first() / last() 首个/最后一个周期
to_period() 转换为周期
to_timestamp() 转换为时间戳
tz_convert() 转换时区
tz_localize() 设置时区

示例:

# Rolling window
result = ds['value'].rolling(window=7).mean()

# Expanding window
result = ds['value'].expanding().sum()

# Shift
result = ds['value'].shift(1)  # Lag
result = ds['value'].shift(-1)  # Lead

缺失数据

方法 说明
isna() / isnull() 检测缺失值
notna() / notnull() 检测非缺失值
dropna() 删除缺失值
fillna() 填充缺失值
ffill() 向前填充
bfill() 向后填充
interpolate() 插值
replace() 替换值

I/O 方法

方法 描述
to_csv() 导出为 CSV
to_json() 导出为 JSON
to_excel() 导出为 Excel
to_parquet() 导出为 Parquet
to_feather() 导出为 Feather
to_sql() 导出到 SQL 数据库
to_pickle() Pickle
to_html() HTML 表格
to_latex() LaTeX 表格
to_markdown() Markdown 表格
to_string() 字符串表示形式
to_dict() 字典
to_records() 记录
to_numpy() NumPy 数组
to_clipboard() 剪贴板

详细文档请参阅 I/O 操作


迭代

方法 描述
items() 遍历 (列, Series)
iterrows() 遍历 (索引, Series)
itertuples() 以命名元组形式遍历

与 Pandas 的关键区别

1. 返回类型

# Pandas returns Series
pdf['col']  # → pd.Series

# DataStore returns ColumnExpr (lazy)
ds['col']   # → ColumnExpr

2. 惰性执行

# DataStore operations are lazy
result = ds.filter(ds['age'] > 25)  # Not executed yet
df = result.to_df()  # Executed here

3. 不支持 inplace 参数

# Pandas
df.drop(columns=['col'], inplace=True)

# DataStore (always returns new object)
ds = ds.drop(columns=['col'])

4. 结果对比

# Use to_pandas() for comparison
pd.testing.assert_frame_equal(
    ds.to_pandas(),
    expected_df
)

完整信息请参见关键区别

Navigation