Why does df.apply(tuple) work but not df.apply(list)?

The culprit is here. With func=tuple it works, but using func=list raises an exception from within the compiled module lib.reduce:

ValueError: ('function does not reduce', 0)

As you can see, they catch the exception but don’t bother to handle it.

Even without the too-broad except clause, that’s a bug in pandas. You might try to raise it on their tracker, but similar issues have been closed with some flavour of wont-fix or dupe.

16321: weird behavior using apply() creating list based on current columns

15628: Dataframe.apply does not always return a Series when reduce=True

That latter issue got closed, then reopened, and converted into a docs enhancement request some months ago, and now seems to be being used as a dumping ground for any related issues.

Presumably it’s not a high priority because, as piRSquared commented (and one of the pandas maintainers commented the same), you’re better off with a list comprehension:

pd.Series([list(x) for x in df.itertuples(index=False)])

Typically apply would be using a numpy ufunc or similar.

Leave a Comment