Można użyć groupby/cumcount
przypisać numery kolumn, a następnie zadzwonić pivot
:
import pandas as pd
df = pd.DataFrame({'x': [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2],
'y': [1, 1, 2, 5, 6, 8, 1, 8, 4, 1, 7, 3]})
df['columns'] = df.groupby('x')['y'].cumcount()
# x y columns
# 0 0 1 0
# 1 1 1 0
# 2 2 2 0
# 3 0 5 1
# 4 1 6 1
# 5 2 8 1
# 6 0 1 2
# 7 1 8 2
# 8 2 4 2
# 9 0 1 3
# 10 1 7 3
# 11 2 3 3
result = df.pivot(index='x', columns='columns')
print(result)
plony
y
columns 0 1 2 3
x
0 1 5 1 1
1 1 6 8 7
2 2 8 4 3
Lub, jeśli naprawdę można polegać na wartościach w x
powtarza w celu N razy,
N = 3
result = pd.DataFrame(df['y'].values.reshape(-1, N).T)
daje
0 1 2 3
0 1 5 1 1
1 1 6 8 7
2 2 8 4 3
Korzystanie reshape
jest szybsze niż dzwonienie groupby/cumcount
i pivot
, ale jest mniej odporne, ponieważ opiera się na wartościach w y
pojawiające się w odpowiedniej kolejności.
Uważam, że w oczekiwanym wyniku brakuje nagłówka kolumny, ponieważ masz pięć kolumn liczb i cztery nagłówki. –