All the answers look equally complex, so I decided to run some benchmarks to help the OP make a decision.
I benchmarked each of the three solutions, each four times in succession, using IPython's %timeit magic. I used the OP's original 6x10 dataframe and a randomly-generated 100x10000 dataframe:
| Solution |
Avg. time to run on OP's dataframe |
Avg. time to run on 100x10000 dataframe |
| mozway |
2.1 ms |
42.88 ms (0.048 seconds) |
| Asish M. |
4.5 ms |
2,200 ms (2.2 seconds) |
| BENY |
13.3 ms |
1,772 ms (1.77 seconds) |
mozway's is by far the fastest.
Congrats, @mozway!
Benchmark details for OP's dataset
# mozway
2.15 ms ± 29 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.09 ms ± 17 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.1 ms ± 20.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.1 ms ± 16.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# Asish M.
4.51 ms ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.49 ms ± 25.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.48 ms ± 20.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
4.51 ms ± 29.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# BENY
13.5 ms ± 419 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.3 ms ± 700 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.3 ms ± 285 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
13.3 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Benchmark details for 100x10000 dataset
# BENY
1.77 s ± 11.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.77 s ± 13.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.76 s ± 13.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.79 s ± 32.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# Asish M.
2.21 s ± 17.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.2 s ± 9.42 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.19 s ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.2 s ± 24.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# mozway
42.4 ms ± 1.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
43.9 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
43 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
42.2 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Code used to generate 100x10000 dataset
import random
import numpy as np
dct = {}
sz = 100
for x in range(sz):
for y in range(sz):
k = f'a{x}_l{y}'
dct[k] = [random.choice(nums) for _ in range(sz)]
dct[k].sort(key=lambda x: np.isnan(x)) # put nans at the end
dct['id'] = list(range(sz))
df = pd.DataFrame(dct)