<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blosc Home Page  (Posts about ctable arrow pandas interop compression)</title><link>https://blosc.org/</link><description></description><atom:link href="https://blosc.org/categories/ctable-arrow-pandas-interop-compression.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:blosc@blosc.org"&gt;The Blosc Developers&lt;/a&gt; </copyright><lastBuildDate>Fri, 17 Jul 2026 12:28:13 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Not an island: bringing compression to the tabular ecosystem</title><link>https://blosc.org/posts/not-an-island-tabular-ecosystem/</link><dc:creator>Francesc Alted</dc:creator><description>&lt;p&gt;A compression library can go one of two ways: try to be everything (its own dataframe, its own query engine, its own format that nothing else reads), or be a fast, compact layer that slots underneath the tools you already use. Python-Blosc2 has initially leaned toward the first path, but this is changing quite dramatically.  During the past year, we put a lot of effort in making Python-Blosc2 as much compatible as possible with the &lt;a class="reference external" href="https://data-apis.org/array-api/latest/"&gt;array API initiative&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And today's 4.9.1 release pushes compatibility with the tabular library ecosystem further than ever: &lt;a class="reference external" href="https://blosc.org/python-blosc2/reference/ctable.html"&gt;CTable&lt;/a&gt;, our compressed table container, now plugs straight into Arrow, pandas, Polars and DuckDB.&lt;/p&gt;
&lt;section id="speaking-arrow"&gt;
&lt;h2&gt;Speaking Arrow&lt;/h2&gt;
&lt;p&gt;The star of this release is support for the &lt;a class="reference external" href="https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html"&gt;Arrow PyCapsule protocol&lt;/a&gt; — the lingua franca of modern tabular tools. In plain terms: any Arrow-aware tool can now read a &lt;code class="docutils literal"&gt;CTable&lt;/code&gt; directly, streaming it in small batches, without you converting anything first. Here is the same query — average fare per taxi company — asked five different ways, all against the same compressed file:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-1" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-1" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;blosc2&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-2" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-2" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-3" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-3" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"trips.b2z"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-4" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-4" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-5" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-5" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-5"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# With Blosc2 itself...&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-6" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-6" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fare"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-7" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-7" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-8" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-8" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# ...or in SQL, with DuckDB reading the compressed table directly&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-9" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-9" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-9"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;duckdb&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-10" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-10" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-10"&gt;&lt;/a&gt;&lt;span class="n"&gt;duckdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"SELECT company, avg(fare) FROM t GROUP BY company"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-11" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-11" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-12" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-12" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-12"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# ...or with Polars&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-13" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-13" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-13"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;polars&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pl&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-14" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-14" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-14"&gt;&lt;/a&gt;&lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fare"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-15" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-15" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-16" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-16" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-16"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# ...or with pandas &amp;gt;= 3.0&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-17" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-17" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-17"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-18" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-18" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-18"&gt;&lt;/a&gt;&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s2"&gt;"fare"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-19" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-19" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-19"&gt;&lt;/a&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-20" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-20" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-20"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# ...or with plain pyarrow&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-21" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-21" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-21"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pyarrow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pa&lt;/span&gt;
&lt;a id="rest_code_105e4872f5bc4141a1b43daf64fe61bb-22" name="rest_code_105e4872f5bc4141a1b43daf64fe61bb-22" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_105e4872f5bc4141a1b43daf64fe61bb-22"&gt;&lt;/a&gt;&lt;span class="n"&gt;pa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="s2"&gt;"fare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"mean"&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pick whichever syntax you like best — the data stays compressed on disk either way.&lt;/p&gt;
&lt;p&gt;And it works the other way around too — hand &lt;code class="docutils literal"&gt;CTable.from_arrow()&lt;/code&gt; a Polars dataframe, a pyarrow table or a Parquet reader, and you get a compressed table back:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-1" name="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-1" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_b8e0f79d4d544b4d9cfd571213e981cd-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;polars&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pl&lt;/span&gt;
&lt;a id="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-2" name="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-2" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_b8e0f79d4d544b4d9cfd571213e981cd-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-3" name="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-3" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_b8e0f79d4d544b4d9cfd571213e981cd-3"&gt;&lt;/a&gt;&lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"ticker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"AAPL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"GOOG"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;"close"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;184.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;140.8&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;
&lt;a id="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-4" name="rest_code_b8e0f79d4d544b4d9cfd571213e981cd-4" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_b8e0f79d4d544b4d9cfd571213e981cd-4"&gt;&lt;/a&gt;&lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Blosc2 isn't inventing anything here — it just implements a protocol the whole ecosystem already agreed on.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="strings-that-everyone-understands"&gt;
&lt;h2&gt;Strings that everyone understands&lt;/h2&gt;
&lt;p&gt;Text columns used to force an awkward choice in Blosc2: fixed-width strings (fast, but every value pays for the longest one) or variable-length strings (flexible, but slow to query). The new &lt;code class="docutils literal"&gt;blosc2.utf8()&lt;/code&gt; column type ends that dilemma: it stores text in the exact same layout Arrow uses, so every row costs only what it needs — up to 13x less memory than fixed-width on free-form text — and data flows to and from Arrow tools with no translation.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-1" name="rest_code_734d00dc6b384edab44e038794ef526a-1" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;dataclasses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-2" name="rest_code_734d00dc6b384edab44e038794ef526a-2" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;blosc2&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-3" name="rest_code_734d00dc6b384edab44e038794ef526a-3" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-4" name="rest_code_734d00dc6b384edab44e038794ef526a-4" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-4"&gt;&lt;/a&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-5" name="rest_code_734d00dc6b384edab44e038794ef526a-5" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-5"&gt;&lt;/a&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Place&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-6" name="rest_code_734d00dc6b384edab44e038794ef526a-6" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-6"&gt;&lt;/a&gt;    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-7" name="rest_code_734d00dc6b384edab44e038794ef526a-7" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-7"&gt;&lt;/a&gt;    &lt;span class="n"&gt;visitors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-8" name="rest_code_734d00dc6b384edab44e038794ef526a-8" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-9" name="rest_code_734d00dc6b384edab44e038794ef526a-9" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blosc2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Place&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-10" name="rest_code_734d00dc6b384edab44e038794ef526a-10" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-10"&gt;&lt;/a&gt;    &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"café"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"O'Hare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"日本語のテキスト"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"zürich"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-11" name="rest_code_734d00dc6b384edab44e038794ef526a-11" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-11"&gt;&lt;/a&gt;    &lt;span class="s2"&gt;"visitors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_734d00dc6b384edab44e038794ef526a-12" name="rest_code_734d00dc6b384edab44e038794ef526a-12" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_734d00dc6b384edab44e038794ef526a-12"&gt;&lt;/a&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And yes, it is fast: reading a full 10-million-row column requires just a fraction of a second; filtering is fast too, and &lt;code class="docutils literal"&gt;utf8()&lt;/code&gt; even beats fixed-width strings as a &lt;code class="docutils literal"&gt;group_by()&lt;/code&gt; key. Filters, sorting and grouping all work on it out of the box. However, sometimes you may still want to use &lt;code class="docutils literal"&gt;string()&lt;/code&gt; / &lt;code class="docutils literal"&gt;vlstring()&lt;/code&gt; for specific use cases; see the &lt;a class="reference external" href="https://blosc.org/python-blosc2/reference/ctable.html#choosing-a-string-column-type"&gt;"Choosing a string column type" guide&lt;/a&gt; if you want the details.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="feeling-at-home-for-pandas-users"&gt;
&lt;h2&gt;Feeling at home for pandas users&lt;/h2&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;CTable&lt;/code&gt; also picked up more of pandas' vocabulary this cycle, so familiar idioms now just work — chaining with &lt;code class="docutils literal"&gt;assign()&lt;/code&gt; and &lt;code class="docutils literal"&gt;col()&lt;/code&gt;, proper missing-data handling with &lt;code class="docutils literal"&gt;fillna()&lt;/code&gt; and &lt;code class="docutils literal"&gt;dropna()&lt;/code&gt;, and custom aggregation functions in &lt;code class="docutils literal"&gt;group_by()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-1" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-1" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;blosc2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;
&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-2" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-2" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-3" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-3" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"revenue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"cost"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-4" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-4" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-4"&gt;&lt;/a&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"profit"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-5" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-5" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-5"&gt;&lt;/a&gt;  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"profit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_3630b8ed97e34535a7cdc336729dbdda-6" name="rest_code_3630b8ed97e34535a7cdc336729dbdda-6" href="https://blosc.org/posts/not-an-island-tabular-ecosystem/#rest_code_3630b8ed97e34535a7cdc336729dbdda-6"&gt;&lt;/a&gt;  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And if you'd rather stay in pandas entirely, you can still bring Blosc2's compute engine with you: &lt;code class="docutils literal"&gt;df.apply(func, engine=blosc2.jit)&lt;/code&gt; now works correctly inside pandas 3, and &lt;code class="docutils literal"&gt;Series.map()&lt;/code&gt; supports it too. See the &lt;a class="reference external" href="https://blosc.org/python-blosc2/guides/pandas_engine.html"&gt;"Using Blosc2 as a pandas engine" guide&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cooperation-not-completeness"&gt;
&lt;h2&gt;Cooperation, not completeness&lt;/h2&gt;
&lt;p&gt;Although &lt;code class="docutils literal"&gt;CTable&lt;/code&gt; object comes with powerful machinery, it doesn't need to replace DuckDB, Polars or pandas to be useful; it just needs to hand them data in the shape they already expect — while doing the compression and fast querying underneath. If interoperating with the tools you already love sounds like the right job for a compression library, this is the release that makes the case.&lt;/p&gt;
&lt;p&gt;Install it with:&lt;/p&gt;
&lt;pre class="literal-block"&gt;pip install blosc2 --upgrade&lt;/pre&gt;
&lt;p&gt;Full release notes: &lt;a class="reference external" href="https://github.com/Blosc/python-blosc2/releases"&gt;https://github.com/Blosc/python-blosc2/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy data!&lt;/p&gt;
&lt;/section&gt;</description><category>ctable arrow pandas interop compression</category><guid>https://blosc.org/posts/not-an-island-tabular-ecosystem/</guid><pubDate>Fri, 17 Jul 2026 12:00:00 GMT</pubDate></item></channel></rss>