跳转到主内容
跳转到主内容

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

属性与特性

Property描述是否触发计算
shape(行, 列)元组
columns列名(Index)
dtypes列数据类型
valuesNumPy 数组
index行索引
size元素个数
ndim维度数
emptyDataFrame 是否为空
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

索引和选择

MethodDescriptionExample
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()按数据类型选择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')

统计方法

MethodDescriptionSQL Equivalent
mean()平均值AVG()
median()中位数MEDIAN()
mode()众数-
std()标准差STDDEV()
var()方差VAR()
min()最小值MIN()
max()最大值MAX()
sum()求和SUM()
prod()乘积-
count()非空计数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'}))

数据操作

MethodDescription
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])
)

排序和排名

MethodDescription
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')

重塑(Reshaping)

MethodDescription
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')

合并 / 连接

MethodDescription
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)

二元运算

MethodDescription
add() / radd()加法
sub() / rsub()减法
mul() / rmul()乘法
div() / rdiv()除法
truediv() / rtruediv()真除(true division)
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()显示差异

函数应用

MethodDescription
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)
)

时间序列

MethodDescription
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
)

完整说明请参阅关键差异