NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2114 most downloaded on PyPI
The portable Python dataframe library
Last release 8 months ago
07 Feb 2026
Ships on a steady schedule
a new release about every 2 weeks
Most releases are documented
notes for 40 of 58 stable releases
2 versions withdrawn
withdrawn after publishing
11 years old
166 releases · first in 2015
pyspark: PySpark <3.5 is no longer supported
upsert() using MERGE INTO (#11624) (9126733), closes #5391sge.National to support unicode in information_schema (#11877) (a254ccb)Backend == "some non backend object" (a5e7c22)schema to insert() (a528450)child to parent in SQLStringView (35a1cfa)One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
trino: remove deprecated password parameter
DataType.name is removed. Use DataType.__class__.__name__ instead.memtables can no longer be named explicitly, please use create_table or create_view to create a named object instead.Struct.destructure is removed in favor of Table.unpack.String.to_date is removed in favor of String.as_date.String.to_timestamp method is removed in favor of String.as_timestamp.IntegerValue.to_interval is removed. Use IntegerValue.as_interval instead.IntegerValue.to_timestamp is removed. Use IntegerValue.as_timestamp instead.ibis.case() is removed. Use ibis.cases() instead.translate function (6fcabf5)get_schema queries (#11520) (c95436d)packaging and cleanup packaging requirement for other backends (05397d7)IntegerValue.to_interval method (378f7ee)IntegerValue.to_timestamp method (12b92a5)String.to_date method (0d22310)String.to_timestamp method (db4c83b)Struct.destructure method (95caf6e)case function (ce927d7)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
datatypes: add Schema.from_sqlglot method to produce an Ibis schema from SQLGlot
Schema.from_sqlglot method to produce an Ibis schema from SQLGlot (#11351) (f6641e7)InSubquery operations (69be180)api: always prefer overwriting existing fields when unpacking with overlapping column names
Expr.to_sql() method (#11357) (493d6e5)on is unspecified (#11383) (4902ec6).sql calls are compiled in topological order (#11439) (8e227ac)DateDiff operands are in the correct order (#11434) (e29881c)Value.substitute (#11413) (1c05d2f)See Also section to fix rendered formatting (#11412) (d381536)Value.to_sql to ibis.to_sql (7e0042c)to_sqlglot to to_sqlglot_columns_definition (#11455) (0e4cf43)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
add Deferred to signatures of many Table methods
create_table (6ea5cd4)includes in create_source (f88c0dc)raw_type to dt.Unknown (#11337) (9296107)Struct.__getitem__ (#11299) (ccd9359)job_id_prefix functionality from raw_sql (#11349) (cf404c2)database param (#11112) (458f06d)connect function in ibis/__init__.py (#11305) (77a6dff)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
api: expose DataType publicly at ibis.DataType
AS JSON for programmatic output of schema information (d55a5ee)temp.main (#11092) (20bec13)sqlglot.DataType, not str, when compiling string dtype (#11124) (99be73b)value is resolvable with no underlying projection (#11125) (a92c3cb)ibis.struct() typing (#11070) (9d3aece)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
api: make topk() and value_counts() more flexible
StringSplit (#11049) (b83a88e)asof_join API via a lateral join (#11024) (8eb9d33)None across all supported backends (#10913) (a02a392)raw_sql (#11001) (c3097a7)Nothing published for this version
Nothing published for this version
datatypes: ensure that newer sqlglot BLOB type is not accessed if it does not exist
duckdb: add read_xlsx implementation
read_xlsx implementation (705aa16)to_xlsx implementation (1800abd)just recipe and setup entry for uv (#10959) (dd33f47)owner column from select metadata query (#10935) (56dcc42)hstore extension registration into separate method (0bdb5a0)Nothing published for this version
examples: expand examples functionality to more backends
nullable arg for type hints (#10893) (601aabe)literal in "Getting started" (#10918) (b69061b)Nothing published for this version
pyspark: add partitionBy argument to create_table (c99cc23), closes #8900
params with raw_sql (#10874) (0a684c3)delta extension for reading deltalake data (#10833) (beeaa29), closes #10829database parameter to list_tables are used as path delineators (#10863) (cdbbcb9)None (e589344)get instead of get_path; get_path does not support columns with spaces (#10836) (50c978b), closes #10835sge.Median is only accessed when it exists (dc6b7e0)__getitem__ docs so that quarto publishes them (#10870) (269cdfe)read_parquet fallback (5fa0103)api: remove deprecated Table.relabel method
as_interval unit argument to be positional-onlyas_timestamp unit argument to be positional-onlyTable.relabel methodStringValue method signaturesNumericValue methodsGeoSpatialValue.contains positional-onlyTable.describe quantile argument keyword-onlyTable.relabel methodTable.drop_null/Table.fill_null/Table.window_by/Table.alias argument positional-onlyTable.sample fraction argument positional-onlyTable.aggregate metrics argument positional-onlyTable set operation methods positional-onlyTable.cast and Table.try_cast methods positional-onlynth positional-onlyisin/notin/cases/identical_to positional-onlynull function positional-onlyValue.cast and Value.try_cast positional-onlyValue.name positional-onlyExpr.pipe positional-onlyExpr.equals positional-onlyto_json methodsto_delta methodsto_csv/to_csv_dir methodsto_parquet/to_parquet_dir methods.sql method signatures across polars and sql as well as the Table methodconnect method now takes its first argument as positional-onlyread_sqlite/read_mysql/read_postgres methods in the duckdb backendread_delta method; sources are positional-only, everything else is required-keywordhas_operation backend method; single argument is positional-onlyread_kafka and to_kafka methods of the PySpark backenddrop_table_or_view method of the impala backendto_geo signature of the the DuckDB backendread_geo signature of the the DuckDB backendlist_catalogs; like` argument is now keyword-onlyset_database signaturelist_databases arguments all required-keywordcreate_* methodsread_pandas methoddrop_table method; name is positional-only; the rest are keyword-onlycreate_catalog and drop_catalog methods; name is positional-only; the rest are keyword-onlycompile method is now the same across backendscreate_table method; name is positional-only; obj is positional-or-keyword; the rest are keyword-onlycreate_view method; name is positional-only; obj is positional-or-keyword; the rest are keyword-onlydrop_view method; name is positional-only; the rest are keyword-onlytruncate_table method; name is positional-only; the rest are keyword-onlyinsert method; name is positional-only; obj is positional-or-keyword; the rest are keyword-onlyread_json method; sources are positional-only, everything else is required-keywordread_csv method; sources are positional-only, everything else is required-keywordread_parquet method; sources are positional-only, everything else is required-keywordto_torch methodto_polars methodBackend.list_tables method; all arguments are now keyword-onlyBackend.table method; name is positional-only; everything else is required-keywordcreate_database and drop_database; name is positional-only; everything else is required-keywordMapValue method signaturesArrayValue method signaturestype argument of struct function is now required-keywordTemporalValue APIswhere argument of aggregate functions is now required-keywordhashbytes and hexdigest are now positional-onlyhow argument to join methods as keyword-only and standardize remaining argumentsibis.coalesce/ibis.greatest/ibis.least are now positional-onlyExpr.ifelse is now positional-onlyset_backend and get_backend functions are now positional-onlyntile function and method is now positional-only/ibis.following` are now positional-onlyexpr argument of ibis.asc/ibis.desc is now positional-only; nulls_first is keyword-onlydata argument of ibis.memtable is now positional-only; the rest are keyword-onlypairs argument of ibis.schema is now positional-only; the rest are keyword-onlyibis.param is now positional-onlyn argument in Table.limit and Table.head is now required-positionaloffset argument in Table.limit is now required-keywordto_pyarrow and to_pyarrow_batches requires expr as positional-only and keyword for everything elseto_pandas_batches requires expr as positional-onlyexecute and to_pandas methods now require expr as positional-onlydistance is now a required keyword argument for the d_within apiread_csv method accepts only DuckDB types for the values components of the columns and types arguments. You may need need to adjust existing code. For example, the string "float64" should be replaced with the string "double".read_in_memory method is removed from the duckdb backend. Use ibis.memtable instead.how parameter of the Value.arbitrary method is removed. call Value.first or Value.last explicitlyStringValue.initcap method is removed. Use StringValue.capitalize instead.IntegerValue.label is redundant with the IntegerValue.cases method, use that instead. Replace expr.label(labels) with expr.cases(*enumerate(labels))register method has been removed. Please use the file-specific read_* methods instead. For in-memory objects, pass them to ibis.memtable or create_table.temp_directory argument passed to Ibis is removed in favor of passing the argument through directly to duckdb.connect. Interior nodes of directory trees must be created, e.g., using Path.mkdir(exists_ok=True, parents=True), mkdir -p, etc.option_context is removed. Use contextlib.contextmanager to create your own version of this functionality if necessary.has_name has always returned True since 9.0. It is safe to remove any calls to has_name.execute now returns non-numpy objects for scalar values.ibis.negate is removed. Use the negate method on a
specific column, instead.ibis.geo_* functions are removed. Equivalent
methods are available on all geo columns.where is removed. Use ibis.ifelse instead.Value.greatest and Value.least are removed. Use
ibis.greatest and ibis.least, instead.pyarrow.Table or a pandas.DataFrame as
the right-hand-side of a join is no longer supported.To join against in-memory data, you can pass the in-memory object to
ibis.memtable or con.create_table and use the resulting table object
instead.
api: Removed hierarchical usage of schema. Ibis uses the following naming conventions:
mysql: Ibis now uses the MySQLdb driver. You may need to install MySQL client libraries to build the extension.
padding: String padding operations now follow Python semantics and leave strings greater than the padding length untouched.
pandas: The pandas backend is removed. Note that pandas DataFrames are STILL VALID INPUTS AND OUTPUTS and will remain so for the foreseeable future. Please use one of the other local backends like DuckDB, Polars, or DataFusion to perform operations directly on pandas DataFrames.
dask: The dask backend is removed. Please use one of the
other backends that Ibis supports.
api: remove deprecated where methodism (886b2d1)
api: remove top-level negate function (c8c37dd)
api: remove top-level geo functions (6b187c3)
backends: convert scalars to non-numpy python objects (#10233) (df08d5e)
duckdb: bump version lower bound to 0.10 (8dbbc8b)
mysql: port to MySQLdb instead of pymysql (#10077) (2b6633c), closes #10055
value: remove deprecated greatest and least methods (65f0973)
distinct option to collect (13cf036)name kwarg to Table.value_counts() (#10361) (12e6057)StringValue.as_time for parsing strings into times (#10278) (9134ef5)to_geo methods for writing geospatial output (#10299) (9f565a9), closes #10296modes array aggregation (#10737) (6603c6c)Table.sample to native TABLESAMPLE syntax when possible (321a3b5)read_csv (#10317) (b57be01)nullable kwarg to string parsed dtypes (#10632) (4583dee), closes #10243Column.to_list() API (#10498) (d11a292), closes #10102memtable (56ec371)Intersection and Difference ops (#10623) (69b848a)StringFind operation (#10624) (5e8855d)TimeFromHMS op (#10635) (ff885fb)bit_and, bit_or, bit_xor) (#10634) (56a66de)sample (c7c900b)psycopg rather than psycopg2 (#10659) (85b449e)include_null in first/last aggs (d3e4104)round output type (#10351) (b2b0925)to_pyarrow() instead of execute() when pretty printing scalars (10b38ee)exists instead of replace for create_database (#10767) (3c13d67)pd.Timestamp or pd.Series[datetime64] for date.to_pandas() (#8784) (2e56acb)pyarrow (#10503) (24c0aca), closes #10492random/sample methods (5a47668)temp=None (#10289) (ea1c179)ibis.random() generates a new value per call (#10173) (1667f43)mediumint (6d22c5c)IF NOT EXISTS if force=True (#10785) (d613b55)list_tables (#10466) (23c0e81)pl.Array (#10260) (aadae58)NaT/None into timestamp columns (#10748) (847ed85)IF NOT EXISTS if force=True (#10782) (c7d1d38)dialect to sg.func (#10407) (210ab3c)sample to TABLESAMPLE on physical tables (#10218) (bdb718d)as_posix instead of as_uri to avoid escaping special characters (#10792) (ec41d4c)order_by calls during select merging (#10475) (6e693b7), closes #10428argmin/argmax (#10227) (51335ed)to_array in favor of as_scalar in docstring (#10508) (62e8b6c)re_search need only match part of a string (#10402) (78d88a5)distinct in difference(), add examples (#10716) (b711f39)count, percent_rank, cume_dist, ntile example usage (#10435) (291bb69)asof_join weather example (#10507) (7595ca6)having example for GroupedTable (#10457) (130e4d5)Value.asc and Value.desc examples (#10515) (41c8f23)day_of_year example (#10376) (40c14c3)strftime examples (#10362) (11b4e3a)truncate examples (#10367) (41a9b7d)get_backend and get_name (#10449) (ae1bb20)ffill/bfill how-to guide (70de8db)to_* methods) (#10164) (b39ec14)compile method is now the same across backends (2a2e3c5)data argument of ibis.memtable is now positional-only; the rest are keyword-only (869fe02)distance is now a required keyword argument for the d_within api (d9f1692)execute and to_pandas methods now require expr as positional-only (d8d6852)Expr.ifelse is now positional-only (8b094d7)expr argument of ibis.asc/ibis.desc is now positional-only; nulls_first is keyword-only (633ccab)hashbytes and hexdigest are now positional-only (fd5e7e3)ibis.coalesce/ibis.greatest/ibis.least are now positional-only (8cc7216)ibis.param is now positional-only (6d5f036)n argument in Table.limit and Table.head is now required-positional (1e3473a)ntile function and method is now positional-only (a33ccb3)offset argument in Table.limit is now required-keyword (9c159a7)pairs argument of ibis.schema is now positional-only; the rest are keyword-only (a252ee5)set_backend and get_backend functions are now positional-only (6b458b7)to_pandas_batches requires expr as positional-only (d7fb0b1)to_pyarrow and to_pyarrow_batches requires expr as positional-only and keyword for everything else (892a3cf)type argument of struct function is now required-keyword (931dcbc)where argument of aggregate functions is now required-keyword (5b29be3).sql method signatures across polars and sql as well as the Table method (007afcf)Backend.list_tables method; all arguments are now keyword-only (03a4d8a)Backend.table method; name is positional-only; everything else is required-keyword (22de2b5)create_catalog and drop_catalog methods; name is positional-only; the rest are keyword-only (0f8be2c)create_database and drop_database; name is positional-only; everything else is required-keyword (f5fae11)create_table method; name is positional-only; obj is positional-or-keyword; the rest are keyword-only (895a0af)create_view method; name is positional-only; obj is positional-or-keyword; the rest are keyword-only (fae9f76)drop_table method; name is positional-only; the rest are keyword-only (4acc7e1)drop_view method; name is positional-only; the rest are keyword-only (4488e62)insert method; name is positional-only; obj is positional-or-keyword; the rest are keyword-only (98dc49f)list_catalogs; like` argument is now keyword-only (456d579)read_csv method; sources are positional-only, everything else is required-keyword (681378c)read_delta method; sources are positional-only, everything else is required-keyword (ed3df4b)read_json method; sources are positional-only, everything else is required-keyword (643516a)read_parquet method; sources are positional-only, everything else is required-keyword (63d44e6)to_csv/to_csv_dir methods (9a641f8)to_delta methods (3440922)to_json methods (a557414)to_parquet/to_parquet_dir methods (f099499)to_polars method (6b055b1)to_torch method (ce2f81d)truncate_table method; name is positional-only; the rest are keyword-only (d6e411b)drop_table_or_view method of the impala backend (b87418d)has_operation backend method; single argument is positional-only (6b53a21)read_geo signature of the the DuckDB backend (38d2190)read_kafka and to_kafka methods of the PySpark backend (bab767d)to_geo signature of the the DuckDB backend (c8589b2)Backend.from_connection (cb28632)Backend.from_connection (00ff77e)as_interval unit argument to be positional-only (eda91b2)as_timestamp unit argument to be positional-only (f58c9d5)/ibis.following` are now positional-only (8ec0d11)GeoSpatialValue.contains positional-only (64825db)isin/notin/cases/identical_to positional-only (13695f1)list_databases arguments all required-keyword (9beb279)nth positional-only (dd0bbc2)Table.aggregate metrics argument positional-only (028fc6c)Table.cast and Table.try_cast methods positional-only (3bfcc0c)Table.describe quantile argument keyword-only (94758b1)Table.drop_null/Table.fill_null/Table.window_by/Table.alias argument positional-only (a1731a8)Table.sample fraction argument positional-only (a1fa4b0)Table set operation methods positional-only (f363a07)Value.cast and Value.try_cast positional-only (75c9e6b)null function positional-only (da4cb1e)has_name (#10246) (adc2fd0)IntegerValue.label (6278f7e)StringValue.initcap method (0ba40da)Table.relabel method (1480cf7)Table.relabel method (1ae4025)how parameter from Value.arbitrary (64521bc)ArrayValue method signatures (bc4c7a3)how argument to join methods as keyword-only and standardize remaining arguments (08cf816)MapValue method signatures (7313dfc)NumericValue methods (e0460b5)StringValue method signatures (cd7c1b6)TemporalValue APIs (72c14d7)connect method now takes its first argument as positional-only (a7a050a)set_database signature (6777877)Compiler.dialect type hint, remove unneeded duckdb compilation rule for RegexReplace (#10400) (a806691)option_context (4f15905)read_sqlite/read_mysql/read_postgres methods in the duckdb backend (a522187)temp_directory through as-is to duckdb.connect (4ea041f)read_in_memory method from the duckdb backend (8343c98)Expr.equals positional-only (024ccc6)Expr.pipe positional-only (413e52e)Value.name positional-only (3abddd1)_is_null_literal to its call site (78edd68)read_pandas method (f5a4c79)create_* methods (778ea46)sample with a shared rewrite rule (b95a036)TableNotFound when a table does not exist (#9695) (0c49e3b)tuple from Table.columns instead of list (7d89a39)destructure for removal in 11.0 (e0bc9b7)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →