Remix.run Logo
Pandas 3.0(pandas.pydata.org)
152 points by jonbaer 5 days ago | 35 comments
edschofield 3 hours ago | parent | next [-]

The design of Pandas is inferior in every way to Polars: API, memory use, speed, expressiveness. Pandas has been strictly worse since late 2023 and will never close the gap. Polars is multithreaded by default, written in a low-level language, has a powerful query engine, supports lazy, out-of memory execution, and isn’t constrained by any compatibility concerns with a warty, eager-only API and pre-Arrow data types that aren’t nullable.

It’s probably not worth incurring the pain of a compatibility-breaking Pandas upgrade. Switch to Polars instead for new projects and you won’t look back.

noo_u 6 minutes ago | parent | next [-]

Polars took a lot of ideas from Pandas and made them better - calling it "inferior in every way" is all sorts of disrespectful :P

Unfortunately, there are a lot of third party libraries that work with Pandas that do not work with Polars, so the switch, even for new projects, should be done with that in mind.

sampo 12 minutes ago | parent | prev | next [-]

Historically, Pandas was a project by someone working in finance to use Python instead of Excel, and be better than using just raw Python/Numpy arrays and dicts.

For better or worse, like Excel and like the simpler programming languages of old, Pandas lets you overwrite data in place.

    df_pandas = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [10, 20, 30, 40, 50]})
    df_polars = pl.from_pandas(df_pandas)
    df_pandas.loc[1:3, 'b'] += 1
    df_pandas
       a   b
    0  1  10
    1  2  21
    2  3  31
    3  4  41
    4  5  50
Polars comes from a more modern data engineering philosopy, and data is immutable. In Polars, if you ever wanted to do such a thing, you'd write a pipeline to process and replace the whole column.

    df_polars = df_polars.with_columns(
        pl.when(pl.int_range(0, pl.len()).is_between(1, 3))
        .then(pl.col("b") + 1)
        .otherwise(pl.col("b"))
        .alias("b")
    )
If you just interactively play around with your data, and want to do it in Python and not in Excel or R, Pandas might still hit the spot. Or use Polars, and if need be then temporarily convert the data to Pandas or even to a Numpy array, manipulate, and then convert back.

P.S. Polars has an optimization to overwite a single value

    df_polars[4, 'b'] += 5
    df_polars
    ┌─────┬─────┐
    │ a   ┆ b   │
    │ --- ┆ --- │
    │ i64 ┆ i64 │
    ╞═════╪═════╡
    │ 1   ┆ 10  │
    │ 2   ┆ 21  │
    │ 3   ┆ 31  │
    │ 4   ┆ 41  │
    │ 5   ┆ 55  │
    └─────┴─────┘
But as far as I know, it doesn't allow slicing or anything.
rich_sasha 2 hours ago | parent | prev | next [-]

I almost fully agree. I would add that Pandas API is poorly thought through and full of footguns.

Where I certainly disagree is the "frame as a dict of time series" setting, and general time series analysis.

The feel is also different. Pandas is an interactive data analysis container, poorly suited for production use. Polars I feel is the other way round.

thelastbender12 an hour ago | parent | next [-]

I think that's a fair opinion, but I'd argue against it being poorly thought out - pandas HAS to stick with older api decisions (dating back to before data science was a mature enough field, and it has pandas to thank for much of it) for backwards compatibility.

ohyoutravel 40 minutes ago | parent | next [-]

Well this is like saying Python must maintain backwards compatibility with Python 2 primitives for all time. It’s simply not true. It’s not easy to deprecate an old API, but it’s doable and there are playbooks for it. Pandas is good, I’ve used it extensively, but agree it’s not fit for production use. They could catch up to the state of the art, but that requires them being very opinionated and willing to make some unpopular decisions for the greater good.

ptman 38 minutes ago | parent | prev [-]

3.0 is the perfect place to break compat

sirfz 2 hours ago | parent | prev [-]

I think that's a sane take. Indeed, I think most data analysts find it much easier to use pandas over polars when playing with data (mainly the bracket syntax is faster and mostly sensible)

v3ss0n 2 hours ago | parent | prev | next [-]

Sounds too much like an advertisement. Also we need to watch out when diving into Polars . Polars is VC backed Opensource project with cloud offering , which may become an opencore project - we know how those goes.

gkbrk 2 hours ago | parent [-]

> we know how those go

They get forked and stay open source? At least this is what happens to all the popular ones. You can't really un-open-source a project if users want to keep it open-source.

stingraycharles 2 hours ago | parent [-]

Depends on your definition of popular; plenty of examples where the business interests don't align well with open source.

bhadass 9 minutes ago | parent | prev | next [-]

why not just go full bore to duckdb?

lairv 26 minutes ago | parent | prev [-]

I would agree if not for the fact that polars is not compatible with Python multiprocessing when using the default fork method, the following script hangs forever (the pandas equivalent runs):

    import polars as pl
    from concurrent.futures import ProcessPoolExecutor

    pl.DataFrame({"a": [1,2,3], "b": [4,5,6]}).write_parquet("test.parquet")

    def read_parquet():
        x = pl.read_parquet("test.parquet")
        print(x.shape)

    with ProcessPoolExecutor() as executor:
        futures = [executor.submit(read_parquet) for _ in range(100)]
        r = [f.result() for f in futures]

Using thread pool or "spawn" start method works but it makes polars a pain to use inside e.g. PyTorch dataloader
postalcoder 3 hours ago | parent | prev | next [-]

I've migrated off of pandas to polars for my workflows to reap the benefit of, in my experience a 10-20x speedup on average. I can't imagine anything bringing me back short of a performance miracle. LLMs have made syntax almost a non-barrier.

lvl155 3 hours ago | parent | next [-]

Went from pandas to polars to duckdb. As mentioned elsewhere SQL is the most readable for me and LLM does most of the coding on my end (quant). So I need it at the most readable and rudimentary/step-wise level.

OT, but I can’t imagine data science being a job category for too long. It’s got to be one of the first to go in AI age especially since the market is so saturated with mediocre talents.

iugtmkbdfil834 an hour ago | parent [-]

<< It’s got to be one of the first to go in AI age especially since the market is so saturated with mediocre talents.

This is interesting. I wanted to dig into it a little since I am not sure I am following the logic of that statement.

Do you mean that AI would take over the field, because by default most people there are already not producing anything that a simple 'talk to data' LLM won't deliver?

howling 3 hours ago | parent | prev | next [-]

Same. I don't even use LLM normally as I found polars' syntax to be very intuitive. I just searched my ChatGPT history and the only times I used it are when I'm dealing with list and struct columns that were not in pandas.

postalcoder 3 hours ago | parent [-]

iirc part of pandas’ popularity was that it modeled some of R’s ergonomics. What a time in history, when such things mattered! (To be clear, I’m not making fun of pandas. It was the bridge I crossed that moved me from living in Excel to living in code.)

iugtmkbdfil834 42 minutes ago | parent [-]

I learned about pandas with R in my class way back when. At the time, it seemed like magic. In a sense, it still does, but things evolve.

mritchie712 3 hours ago | parent | prev | next [-]

also migrated, but to duckdb.

It's funny to look back at the tricks that were needed to get gpt3 and 3.5 to write SQL (e.g. "you are a data analyst looking at a SQL database with table [tables]"). It's almost effortless now.

thibaut_barrere 2 hours ago | parent | prev | next [-]

Polars being so fast, and embeddable into other languages, has made it a no brainer for me to adopt it.

I have integrated Explorer https://github.com/elixir-explorer/explorer, which leverages it, into many Elixir apps, so happy to have this.

thegabriele an hour ago | parent | prev | next [-]

" 10-20x speedup on average. "

Is this everyone's experience?

gHA5 3 hours ago | parent | prev | next [-]

Do you not experience LLM generated code constantly trying to use Pandas' methods/syntax for Polars objects?

edschofield 3 hours ago | parent | next [-]

Yes, ChatGPT 5.2 Pro absolutely still does this. Just ask it for a pivot table using Polars and it will probably spit out code with Pandas arguments that doesn’t work.

postalcoder 3 hours ago | parent | prev [-]

There were some growing pains in gpt-3.5 to gpt-4 era, but not nowadays (shoutout to the now-defunct Phind, which was a game changer back then).

crimsoneer 3 hours ago | parent [-]

The fact they pivoted away from their very compelling core offering (AI stack overflow) to complete with loveable etc in the "AI generated apps" giant fight continues to baffle me. Though I guess model updates ate their lunch.

postalcoder 3 hours ago | parent [-]

My guess is that their pivot came after distress, and was not the cause of it. It'd be great to have @rushingcreek write a post-mortem. I think it'd benefit a lot of people because I honestly don't have a monday morning playbook of what could have saved them.

Like you said, perhaps the demise of phind was inevitable, with large models displacing them kind of like how Spotify displaced music piracy.

alex7o 3 hours ago | parent | prev | next [-]

Same, also polars works on typescript which I used at some point out move my data from backend to frontend

OutOfHere 3 hours ago | parent | prev [-]

The speedup you claim is going to be contingent on how you use Pandas, with which data types, and which version of Pandas.

jtrueb an hour ago | parent | prev | next [-]

That timestamp resolution discrepancy is going to cause so many problems

alexcasalboni 31 minutes ago | parent | prev | next [-]

Haven't used pandas in a while, but Copy-on-Write sounds pretty cool! Is there any public benchmark I can check in 2026?

optimalsolver 3 hours ago | parent | prev | next [-]

How soon will the leading LLMs ingest the updated documentation? Because I'm certainly not going to.

uncletoxa 3 hours ago | parent | next [-]

Use context7 mcp. It'll do the trick

OutOfHere 3 hours ago | parent | prev [-]

In my experience, it would take a year to ingest it natively, and two years to also ingest enough coding examples.

OutOfHere 3 hours ago | parent | prev [-]

s/impactfull/impactful