pythonpandasdataframe

Pandas non-negative integers to n-bits binary representation


I have a pandas Series containing strictly non-negative integers like so:

1
2
3
4
5

I want to convert them into n-bits binary representation based on the largest value. For example, the largest value here is 5, so we would have 3 bits/3 columns, and the resulting series would be something like this

0 0 1
0 1 0
0 1 1
1 0 0
1 0 1

Thanks a lot in advance!


Solution

  • If your values are less than 255, you could unpackbits:

    s = pd.Series([1, 2, 3, 4, 5])
    
    N = int(np.log2(s.max()))
    powers = 2**np.arange(N, -1, -1)
    out = pd.DataFrame(np.unpackbits(s.to_numpy(np.uint8)[:, None], axis=1)[:, -N-1:],
                       index=s.index, columns=powers)
    

    If your have larger numbers, compute a mask with & and an array of powers of 2:

    s = pd.Series([1, 2, 3, 4, 5])
    
    powers = 2**np.arange(int(np.log2(s.max())), -1, -1)
    
    out = pd.DataFrame((s.to_numpy()[:, None] & powers).astype(bool).astype(int),
                       index=s.index, columns=powers)
    

    Output:

       4  2  1
    0  0  0  1
    1  0  1  0
    2  0  1  1
    3  1  0  0
    4  1  0  1