Hugo V
Hugo V

Reputation: 81

Create multiple columns from one column (with the same data)

I have this column (similar but with a lot of more entries)

import pandas as pd
numbers = range(1,16)
sequence = []
for number in numbers:
    sequence.append(number)
df = pd.DataFrame(sequence).rename(columns={0: 'sequence'})

df

and I want to distribute the same values into lots of more columns periodically (and automatically) to get something like this (but with a bunch of values)

df2

Thanks

Upvotes: 1

Views: 241

Answers (4)

jezrael
jezrael

Reputation: 863226

Use reshape with 5 for number of new rows, -1 is for count automatically number of columns:

numbers = range(1,16)

df = pd.DataFrame(np.array(numbers).reshape(-1, 5).T)
    
print (df)
   0   1   2
0  1   6  11
1  2   7  12
2  3   8  13
3  4   9  14
4  5  10  15

If length of values in range cannot be filled to N rows here is possible solution:

L = range(1,22)
N = 5
filled = 0
arr = np.full(((len(L) - 1)//N + 1)*N, filled)

arr[:len(L)] = L
df = pd.DataFrame(arr.reshape((-1, N)).T)
print(df)
   0   1   2   3   4
0  1   6  11  16  21
1  2   7  12  17   0
2  3   8  13  18   0
3  4   9  14  19   0
4  5  10  15  20   0

Upvotes: 3

Mustafa Aydın
Mustafa Aydın

Reputation: 18315

num_cols = 3

result = pd.DataFrame(df.sequence.to_numpy().reshape(-1, num_cols, order="F"))

for a given number of columns, e.g., 3 here, reshapes df.sequence to (total_number_of_values / num_cols, num_cols) where first shape is inferred with -1. The Fortran order matches the structure so that numbers are "going down first",

to get

>>> result

   0   1   2
0  1   6  11
1  2   7  12
2  3   8  13
3  4   9  14
4  5  10  15

If num_cols = 5, then

>>> result

   0  1  2   3   4
0  1  4  7  10  13
1  2  5  8  11  14
2  3  6  9  12  15

Upvotes: 1

anonymous
anonymous

Reputation: 11

If you like to reshape after reading dataframe then

df = pd.DataFrame(df.to_numpy().reshape(5,-1))

Upvotes: 1

Vishnudev Krishnadas
Vishnudev Krishnadas

Reputation: 10960

Use pandas.Series.values.reshape and desired rows and columns

pd.DataFrame(df.sequence.values.reshape(5, -1))

Upvotes: 1

Related Questions