piRSquared piRSquared - 2 months ago 14
Python Question

how do I card shuffle a pandas series quickly

suppose I have the


import pandas as pd
import numpy as np

s = pd.Series(np.arange(10), list('abcdefghij'))

I'd like to "shuffle" this series like a deck of cards by interweaving the top half with the bottom half.

I'd expect results like this

a 0
f 5
b 1
g 6
c 2
h 7
d 3
i 8
e 4
j 9
dtype: int32


One way would be to reshape and then use ravel(order='F') to read the items off in Fortran order:

In [12]: pd.Series(s.values.reshape(2,-1).ravel(order='F'), s.index)
a    0
b    5
c    1
d    6
e    2
f    7
g    3
h    8
i    4
j    9
dtype: int64

Fortran order makes the left-most axis increment fastest. So in a 2D array the items go down the rows of one column before progressing to the next column. This has the effect of interleaving items, compared to the usual C-order.

Alternatively, you could reshape in Fortran order and ravel in C order:

In [17]: s.values.reshape(-1, 2, order='F').ravel()
Out[17]: array([0, 5, 1, 6, 2, 7, 3, 8, 4, 9])