Another approach, similar to this one is to use argsort
which returns the indexes permutation directly:
f = lambda r: r.x**2 + r.y**2df.iloc[df.apply(f, axis=1).argsort()]
I think using argsort
better translates the idea than a regular sort
(we don't care about the value of this computation, only about the resulting indexes).
It could also be interesting to patch the DataFrame to add this functionality:
def apply_sort(self, *, key): return self.iloc[self.apply(key, axis=1).argsort()]pd.DataFrame.apply_sort = apply_sort
We can then simply write:
>>> df.apply_sort(key=f) x y letter2 1 3 b3 4 2 b1 3 4 a4 5 1 c0 2 5 a