{"id":567744,"date":"2025-05-19T02:56:05","date_gmt":"2025-05-19T01:56:05","guid":{"rendered":"https:\/\/blog.jetbrains.com\/pycharm\/2024\/07\/polars-vs-pandas\/"},"modified":"2025-05-19T03:08:52","modified_gmt":"2025-05-19T02:08:52","slug":"polars-vs-pandas","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/de\/pycharm\/2025\/05\/polars-vs-pandas\/","title":{"rendered":"Polars und pandas: Was ist der Unterschied?"},"content":{"rendered":"<p>Wenn Sie im vergangenen Jahr die Entwicklung bei Python-Dataframes verfolgt haben, haben Sie mit Sicherheit schon von <a href=\"https:\/\/www.pola.rs\/\" target=\"_blank\" rel=\"noopener\">Polars<\/a> geh\u00f6rt, der leistungsstarken Dataframe-Bibliothek f\u00fcr gro\u00dfe Datensammlungen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-384206\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/05\/PC-social-BlogFeatured-2559.4445122465695x1439.444482576701-1.png\" alt=\"\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/de-de\/dataspell\/\" target=\"_blank\" rel=\"noopener\"><br \/>Polars in DataSpell ausprobieren<br \/><\/a><\/p>\n<p>Im Gegensatz zu anderen Bibliotheken f\u00fcr gro\u00dfe Datensammlungen wie <a href=\"https:\/\/spark.apache.org\/\" target=\"_blank\" rel=\"noopener\">Spark<\/a>, <a href=\"https:\/\/www.dask.org\/\" target=\"_blank\" rel=\"noopener\">Dask<\/a> und <a href=\"https:\/\/www.ray.io\/\" target=\"_blank\" rel=\"noopener\">Ray<\/a> ist Polars f\u00fcr die Nutzung auf einem einzigen Rechner konzipiert, weswegen es oft mit <a href=\"https:\/\/pandas.pydata.org\/\" target=\"_blank\" rel=\"noopener\">pandas<\/a> verglichen wird. Polars unterscheidet sich jedoch in wichtigen Punkten von pandas, unter anderem in der Art und Weise der Arbeit mit Daten sowie den optimalen Einsatzgebieten. Im folgenden Artikel gehen wir auf die technischen Details ein, die diese beiden Dataframe-Bibliotheken voneinander unterscheiden, und wir werfen einen Blick auf die St\u00e4rken und Beschr\u00e4nkungen beider Bibliotheken.<\/p>\n<p>Um mehr \u00fcber das Thema zu erfahren, sehen Sie sich unten unser Interview mit Polars-Sch\u00f6pfer <a href=\"https:\/\/github.com\/ritchie46\" target=\"_blank\" rel=\"noopener\">Ritchie Vink<\/a> an!<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Was ist Polars?\" src=\"https:\/\/www.youtube.com\/embed\/QfLzEp-yt_U?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<h2 class=\"wp-block-heading\">Warum Polars statt pandas verwenden?<\/h2>\n<p>Mit einem Wort: Performance. Polars wurde von Grund auf f\u00fcr Schnelligkeit entwickelt, sodass es g\u00e4ngige Operationen etwa 5- bis 10-mal schneller als pandas ausf\u00fchrt. Dar\u00fcber hinaus ist der Speicherbedarf von Operationen in Polars deutlich geringer als bei pandas: pandas ben\u00f6tigt f\u00fcr die Durchf\u00fchrung von Operationen etwa 5- bis 10-mal mehr Arbeitsspeicher als die Gr\u00f6\u00dfe des Datensatzes, w\u00e4hrend Polars sich mit dem 2- bis 4-Fachen gen\u00fcgt.<\/p>\n<p><a href=\"https:\/\/duckdblabs.github.io\/db-benchmark\/\" target=\"_blank\" rel=\"noopener\">Hier<\/a> erhalten Sie einen Eindruck davon, wie Polars im Vergleich zu anderen Dataframe-Bibliotheken abschneidet. Wie Sie sehen k\u00f6nnen, ist Polars bei g\u00e4ngigen Operationen 10- bis 100-mal schneller als pandas und eine der schnellsten Dataframe-Bibliotheken \u00fcberhaupt. Au\u00dferdem kann es gr\u00f6\u00dfere Datensammlungen als pandas verarbeiten, bevor ihm der Arbeitsspeicher ausgeht.<\/p>\n<h2 class=\"wp-block-heading\">Warum ist Polars so schnell?<\/h2>\n<p>Angesichts dieser \u00e4u\u00dferst beeindruckenden Ergebnisse fragen Sie sich vielleicht: Wie kann Polars trotz der Ausf\u00fchrung auf einem einzigen Rechner diese Performance erzielen? Bei der Entwicklung der Bibliothek wurde von Anfang an auf Leistung geachtet, und dabei kamen unterschiedliche Mittel zum Einsatz.<\/p>\n<h3 class=\"wp-block-heading\">Geschrieben in Rust<\/h3>\n<p>Einer der bekanntesten Fakten \u00fcber Polars ist, dass es in <a href=\"https:\/\/www.rust-lang.org\/\" target=\"_blank\" rel=\"noopener\">Rust<\/a> geschrieben ist, einer Low-Level-Sprache, deren Geschwindigkeit fast an C und C++ herankommt. pandas hingegen basiert auf Python-Bibliotheken, unter anderem auf <a href=\"https:\/\/numpy.org\/\" target=\"_blank\" rel=\"noopener\">NumPy<\/a>. Zwar ist der Kern von NumPy in C geschrieben, es wird aber trotzdem durch inh\u00e4rente Probleme eingebremst, die mit der Art und Weise zu tun haben, wie Python bestimmte Typen im Arbeitsspeicher handhabt \u2013 zum Beispiel Zeichenfolgen f\u00fcr Kategoriedaten. Dies f\u00fchrt zu einer schlechten Leistung beim Umgang mit diesen Typen (weitere Details finden Sie in einem <a href=\"https:\/\/wesmckinney.com\/blog\/apache-arrow-pandas-internals\/\" target=\"_blank\" rel=\"noopener\">fantastischen Blogartikel<\/a> von <a href=\"https:\/\/wesmckinney.com\/\" target=\"_blank\" rel=\"noopener\">Wes McKinney<\/a>).<\/p>\n<p>Ein weiterer Vorteil von Rust ist, dass es sichere Nebenl\u00e4ufigkeit erm\u00f6glicht, d. h. es ist darauf ausgelegt, Parallelit\u00e4t so vorhersehbar wie m\u00f6glich zu machen. Dadurch kann Polars auch bei komplexen Abfragen mit mehreren Spalten alle Kerne Ihres Systems nutzen \u2013 nicht umsonst nannte Ritchie Vink Polars \u201ehochgradig parallel\u201c. Dies verleiht Polars einen enormen Leistungsvorteil gegen\u00fcber pandas, das zur Ausf\u00fchrung von Operationen nur einen Kern verwendet. In diesem <a href=\"https:\/\/www.youtube.com\/watch?v=7xcUvzERwx0&amp;ab_channel=PyData\" target=\"_blank\" rel=\"noopener\">hervorragenden Vortrag<\/a> auf der diesj\u00e4hrigen PyCon DE geht Nico Kreiling genauer darauf ein, wie Polars dies erreicht.<\/p>\n<h3 class=\"wp-block-heading\">Basierend auf Arrow<\/h3>\n<p>Ein weiterer Faktor, der zur beeindruckenden Performance von Polars beitr\u00e4gt, ist das sprachunabh\u00e4ngige Speicherformat <a href=\"https:\/\/arrow.apache.org\/\" target=\"_blank\" rel=\"noopener\">Apache Arrow<\/a>. Arrow wurde von Wes McKinney als Antwort auf viele Probleme entwickelt, die er bei pandas bei explodierenden Datenmengen erkannte. Es dient auch als Backend f\u00fcr pandas 2.0, eine leistungsf\u00e4higere pandas-Version, die im M\u00e4rz dieses Jahres ver\u00f6ffentlicht wurde. Die Arrow-Backends der Bibliotheken unterscheiden sich jedoch leicht: W\u00e4hrend pandas 2.0 auf PyArrow aufbaut, hat das Polars-Team seine eigene Arrow-Implementierung gebaut.<\/p>\n<p>Einer der Hauptvorteile beim Aufbau einer Datenbibliothek auf der Basis von Arrow ist die Interoperabilit\u00e4t. Arrow wurde entwickelt, um das Format der In-Memory-Daten \u00fcber Bibliotheken hinweg zu standardisieren, und wie Sie <a href=\"https:\/\/arrow.apache.org\/overview\/\" target=\"_blank\" rel=\"noopener\">unten<\/a> sehen k\u00f6nnen, wird es bereits von mehreren wichtigen Bibliotheken und Datenbanken verwendet.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-375452\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/07\/arrow.png\" alt=\"\" width=\"574\" height=\"318\" \/><\/figure>\n<\/div>\n<p>Diese <a href=\"https:\/\/datapythonista.me\/blog\/pandas-20-and-the-arrow-revolution-part-i\" target=\"_blank\" rel=\"noopener\">Interoperabilit\u00e4t<\/a> erh\u00f6ht die Performance, da die Daten nicht mehr in unterschiedliche Formate konvertiert werden m\u00fcssen, wenn sie von einem Pipeline-Schritt zum n\u00e4chsten weitergeleitet werden (anders ausgedr\u00fcckt ist es nicht mehr notwendig, die Daten zu serialisieren und zu deserialisieren). Es ist auch speichereffizienter, da zwei Prozesse dieselben Daten gemeinsam nutzen k\u00f6nnen, ohne eine Kopie erstellen zu m\u00fcssen. Da die Serialisierung\/Deserialisierung bei Daten-Workflows <a href=\"https:\/\/arrow.apache.org\/faq\/\" target=\"_blank\" rel=\"noopener\">ca. 80\u201390% des Rechenaufwands<\/a> ausmacht, verhilft das universelle Arrow-Datenformat Polars zu erheblichen Leistungsgewinnen.<\/p>\n<p>Arrow bietet au\u00dferdem integrierte Unterst\u00fctzung f\u00fcr eine breitere Palette von Datentypen als pandas. Da pandas auf NumPy basiert, kann es hervorragend mit Ganzzahl- und Flie\u00dfkommazahl-Spalten umgehen, hat jedoch Schwierigkeiten bei anderen Datentypen. <a href=\"https:\/\/datapythonista.me\/blog\/pandas-20-and-the-arrow-revolution-part-i\" target=\"_blank\" rel=\"noopener\">Im Gegensatz dazu<\/a> bietet Arrow umfassende Unterst\u00fctzung f\u00fcr Spalten mit Datums-, booleschen und Bin\u00e4rwerten und sogar komplexe Spaltentypen, etwa solche, die Listen enthalten. Au\u00dferdem kann Arrow nativ mit fehlenden Daten umgehen, w\u00e4hrend in NumPy ein Workaround erforderlich ist.<\/p>\n<p>Und schlie\u00dflich verwendet Arrow eine spaltenbasierte Datenspeicherung. Dies bedeutet, dass unabh\u00e4ngig vom Datentyp alle Spalten in einem kontinuierlichen Speicherblock gespeichert werden. Dies vereinfacht nicht nur die Parallelisierung, sondern beschleunigt auch den Datenabruf.<\/p>\n<h3 class=\"wp-block-heading\">Abfrageoptimierung<\/h3>\n<p>Ein weiterer Kernaspekt der Polars-Performance ist die Art und Weise, wie Code ausgewertet wird. pandas setzt standardm\u00e4\u00dfig die sogenannte <em>Eager Execution<\/em> ein, die Operationen werden also in der Reihenfolge ausgef\u00fchrt, in der Sie sie geschrieben haben. Im Gegensatz dazu ist Polars in der Lage, neben Eager Execution auch <em>Lazy Execution<\/em> zu verwenden, wobei ein Abfrageoptimierer alle erforderlichen Operationen auswertet und den effizientesten Weg zur Ausf\u00fchrung des Codes findet. Dies kann unter anderem das \u00c4ndern der Ausf\u00fchrungsreihenfolge von Operationen oder den Verzicht auf redundante Berechnungen beinhalten. Nehmen wir zum Beispiel den folgenden Ausdruck, der jeweils den Mittelwert der Spalte <code>Number1<\/code> f\u00fcr die Kategorien \u201eA\u201c und \u201eB\u201c in <code>Category<\/code> berechnet.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(\ndf\n.groupby(by = \"Category\").agg(pl.col(\"Number1\").mean())\n.filter(pl.col(\"Category\").is_in([\"A\", \"B\"]))\n)<\/pre>\n<p>Bei Eager Execution wird die <code>groupby<\/code>-Operation unn\u00f6tigerweise f\u00fcr den gesamten DataFrame ausgef\u00fchrt, und erst danach wird nach <code>Category<\/code> gefiltert. Bei Lazy Execution kann der DataFrame gefiltert und <code>groupby<\/code> nur auf die relevanten Daten angewendet werden.<\/p>\n<h3 class=\"wp-block-heading\">Ausdrucksstarke API<\/h3>\n<p>Polars verf\u00fcgt \u00fcber eine extrem ausdrucksstarke API. Dies bedeutet, dass im Grunde jede ben\u00f6tigte Operation als Polars-Methode ausgedr\u00fcckt werden kann. Im Gegensatz dazu m\u00fcssen komplexere Operationen in pandas oft als Lambda-Ausdruck an die Methode <code>apply<\/code> \u00fcbergeben werden. Das Problem mit <code>apply<\/code> ist, dass sie in einer Schleife auf die Zeilen des DataFrames angewendet wird, die Operation wird also nacheinander f\u00fcr jede Zeile ausf\u00fchrt. Durch die Verwendung eingebauter Methoden k\u00f6nnen Sie spaltenbasiert arbeiten und SIMD, eine andere Form der Nebenl\u00e4ufigkeit, nutzen.<\/p>\n<h2 class=\"wp-block-heading\">Wann ist pandas zu bevorzugen?<\/h2>\n<p>Das bisher Gesagte klingt so eindrucksvoll, dass Sie sich wahrscheinlich fragen, warum Sie sich \u00fcberhaupt noch mit pandas abgeben sollten. So einfach ist es jedoch nicht. Polars eignet sich zwar hervorragend f\u00fcr hocheffiziente Datentransformationen, ist aber derzeit nicht die optimale Wahl f\u00fcr die Datenexploration oder f\u00fcr den Einsatz in Pipelines f\u00fcr maschinelles Lernen (ML). In diesen Bereichen liegt pandas weiterhin vorn.<\/p>\n<p>Einer der Gr\u00fcnde daf\u00fcr ist, dass Polars zwar eine gro\u00dfe Interoperabilit\u00e4t mit anderen Arrow-basierten Paketen bietet, aber <em>noch nicht<\/em> mit den meisten Python-Paketen zur Datenvisualisierung oder ML-Bibliotheken wie <a href=\"https:\/\/scikit-learn.org\/stable\/\" target=\"_blank\" rel=\"noopener\">scikit-learn<\/a> und <a href=\"https:\/\/pytorch.org\/\" target=\"_blank\" rel=\"noopener\">PyTorch<\/a> kompatibel ist. Die einzige Ausnahme ist <a href=\"https:\/\/plotly.com\/\" target=\"_blank\" rel=\"noopener\">Plotly<\/a>, mit dem Sie Diagramme direkt aus Polars-DataFrames erstellen k\u00f6nnen.<\/p>\n<p>Eine aktuell diskutierte L\u00f6sung w\u00e4re die Verwendung des <a href=\"https:\/\/data-apis.org\/dataframe-protocol\/latest\/index.html\" target=\"_blank\" rel=\"noopener\">Python-Dataframe-Austauschprotokolls<\/a> in diesen Paketen, um ihnen die Unterst\u00fctzung unterschiedlicher Dataframe-Bibliotheken zu erm\u00f6glichen. Dadurch w\u00fcrden Data-Science- und ML-Workflows nicht mehr durch pandas eingebremst werden. Dies ist jedoch eine relativ neue Idee, und die Umsetzung dieser Projekte wird einige Zeit dauern.<\/p>\n<h2 class=\"wp-block-heading\">Tools f\u00fcr Polars und pandas<\/h2>\n<p>Nach all dem k\u00f6nnen Sie es sicher kaum erwarten, Polars eigenh\u00e4ndig auszuprobieren! Sowohl DataSpell als auch <a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/\" target=\"_blank\" rel=\"noopener\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/download\/?section=mac\">PyCharm Professional<\/a> 2023.2 bieten hervorragende Werkzeuge f\u00fcr die Arbeit mit pandas und Polars in Jupyter-Notebooks. So stehen Ihnen insbesondere bei der Visualisierung von pandas- und Polars-DataFrames interaktive Funktionen zur Verf\u00fcgung, mit denen Sie Ihre Daten viel schneller und bequemer erkunden k\u00f6nnen.<\/p>\n<p>Zu meinen Lieblingsfunktionen geh\u00f6ren das Bl\u00e4ttern durch alle Zeilen und Spalten des DataFrames, ohne dass diese abgeschnitten werden, Ein-Klick-Aggregationen von DataFrame-Werten sowie die M\u00f6glichkeit, DataFrames in einer Vielzahl von Formaten zu exportieren (einschlie\u00dflich Markdown!).<\/p>\n<p>Wenn Sie DataSpell noch nicht nutzen, k\u00f6nnen Sie es im Rahmen einer 30-t\u00e4gigen Testphase ausprobieren, indem Sie dem nachstehenden Link folgen.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/\" target=\"_blank\" rel=\"noopener\"><br \/>Probieren Sie es jetzt aus!<br \/><\/a><\/p>\n<p><strong>Autorin des Original-Blogposts:<\/strong><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/BK7A9876_korr_sRGB_8_1000x1500px_square_resized-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Jodie Burchell\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Jodie Burchell<\/h4>\n                                        <p>Dr. Jodie Burchell is the Developer Advocate in Data Science at JetBrains, and was previously a Lead Data Scientist at Verve Group Europe. She completed a PhD in clinical psychology and a postdoc in biostatistics, before leaving academia for a data science career. She has worked for 7 years as a data scientist in both Australia and Germany, developing a range of products including recommendation systems, analysis platforms, search engine improvements and audience profiling. She has held a broad range of responsibilities in her career, doing everything from data analytics to maintaining machine learning solutions in production. She is a long time content creator in data science, across conference and user group presentations, books, webinars, and posts on both her own and JetBrain&#8217;s blogs.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1336,"featured_media":567750,"comment_status":"closed","ping_status":"closed","template":"","categories":[952],"tags":[566,8152],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/567744"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/1336"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=567744"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/567744\/revisions"}],"predecessor-version":[{"id":567774,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/567744\/revisions\/567774"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/567750"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=567744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=567744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=567744"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=567744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}