Change8

rs-0.48.0

Breaking Changes
📦 polarsView on GitHub →
1 breaking11 features🐛 29 fixes🔧 12 symbols

Summary

This release introduces several performance improvements, new features like list.filter and schema matching for LazyFrames, and addresses numerous bugs, including panics and incorrect outputs in various operations. A breaking change involves updating how time zone information is stored internally.

⚠️ Breaking Changes

  • Use a wrapper struct to store time zone. This likely affects how time zone information is handled internally or accessed, requiring consumers relying on the previous structure to update their code.

✨ New Features

  • Implemented list.filter.
  • Support binaryoffset in search sorted.
  • Add nulls_equal flag to list/arr.contains.
  • Allow named opaque functions for serde.
  • Implement LazyFrame.match_to_schema.
  • Improved time-string parsing and inference (generally, and via the SQL interface).
  • Allow for .over to be called without partition_by.
  • Support AnyValue translation from PyMapping values.
  • Add options to write Parquet field metadata.
  • Allow casting List<UInt8> to Binary.
  • Allow setting of regex size limit using POLARS_REGEX_SIZE_LIMIT.

🐛 Bug Fixes

  • Fix reverse list type.
  • Add type equality checking for relevant methods.
  • Invalid output for fill_null after when.then on structs.
  • Don't panic for cross join with misaligned chunking.
  • Panic on quantile over nulls in rolling window.
  • Respect BinaryOffset metadata.
  • Correct the output order of PartitionByKey and PartitionParted.
  • Fallback to non-strict casting for deprecated casts.
  • Handle sliced out remainder for bitmaps.
  • Don't merge Enum categories on append.
  • Fix unnest() not working on empty struct columns.
  • Correct name in unnest error message.
  • Properly account for nulls in the is_not_nan check made in drop_nans.
  • Incorrect result from SQL count(*) with partition by.
  • Fix deadlock joining scanned tables with low thread count.
  • Don't allow deserializing incompatible DSL.
  • Incorrect null dtype from binary ops in empty group_by.
  • Don't mark str.replace_many with Mapping as deprecated.
  • Gzip has maximum compression of 9, not 10.
  • Fix predicate pushdown of fallible expressions.
  • Fix index out of bounds panic when scanning hugging face.
  • Fix polars crate not compiling when lazy feature enabled.
  • Panic on group_by with literal and empty rows.
  • Return input instead of panicking if empty subset in drop_nulls() and drop_nans().
  • Fix nested dtype row encoding.
  • Allow Expr.round() to be called on integer dtypes.
  • Fix panic when filtering based on row index column in parquet.
  • WASM and PyOdide compile.
  • Resolve get() SchemaMismatch panic.

🔧 Affected Symbols

list.evalfrom_recordslist.containsLazyFrame.match_to_schemaunnest()drop_nans()drop_nulls()Expr.round()str.replace_manyPOLARS_REGEX_SIZE_LIMITsink_*PolarsDataType::get_dtype