/ / Jak przekształcić wieloczłonową ramkę danych według indeksu? - python, panda, numpy, ramka danych

Jak przekształcić wieloczłonową ramkę danych według indeksu? - python, panda, numpy, ramka danych

Idąc od tutaj . Rozwiązanie działa tylko dla jednej kolumny. Jak poprawić rozwiązanie dla wielu kolumn. Jeśli mam taką ramkę danych jak

df= pd.DataFrame([["a","b"],["b","c"],["c","z"],["d","b"]],index=[0,0,1,1])
0 1 0 a b 0 b c 1 c z 1 d b

Jak przekształcić je jak

0 1 2 3 0 a b b c 1 c z d b

Jeśli df jest

0 1 0 a b 1 c z 1 d b

Następnie

0 1 2 3 0 a b NaN NaN 1 c z d b

Odpowiedzi:

3 dla odpowiedzi № 1

Posługiwać się flatten/ravel

In [4401]: df.groupby(level=0).apply(lambda x: pd.Series(x.values.flatten()))
Out[4401]:
0  1  2  3
0  a  b  b  c
1  c  z  d  b

Lub, stack

In [4413]: df.groupby(level=0).apply(lambda x: pd.Series(x.stack().values))
Out[4413]:
0  1  2  3
0  a  b  b  c
1  c  z  d  b

Również z nierównymi wskaźnikami

In [4435]: df.groupby(level=0).apply(lambda x: x.values.ravel()).apply(pd.Series)
Out[4435]:
0  1    2    3
0  a  b  NaN  NaN
1  c  z    d    b

2 dla odpowiedzi nr 2

Posługiwać się groupby + pd.Series + np.reshape:

df.groupby(level=0).apply(lambda x: pd.Series(x.values.reshape(-1, )))

0  1  2  3
0  a  b  b  c
1  c  z  d  b

Rozwiązanie dla nierównej liczby indeksów - zadzwoń pd.DataFrame Zamiast tego konstruktor.

df

0  1
0  a  b
1  c  z
1  d  b

df.groupby(level=0).apply(lambda x: 
pd.DataFrame(x.values.reshape(1, -1))).reset_index(drop=True)

0  1    2    3
0  a  b  NaN  NaN
1  c  z    d    b

2 dla odpowiedzi nr 3
pd.DataFrame({n: g.values.ravel() for n, g in df.groupby(level=0)}).T

0  1  2  3
0  a  b  b  c
1  c  z  d  b

To wszystko w jednym miejscu i jestem zbyt zmęczony, aby to było piękne

v = df.values
cc = df.groupby(level=0).cumcount().values
i0, r = pd.factorize(df.index.values)
n, m = v.shape
j0 = np.tile(np.arange(m), n)
j = np.arange(r.size * m).reshape(-1, m)[cc].ravel()
i = i0.repeat(m)

e = np.empty((r.size, m * r.size), dtype=object)

e[i, j] = v.ravel()

pd.DataFrame(e, r)

0  1     2     3
0  a  b  None  None
1  c  z     d     b

1 dla odpowiedzi nr 4

Spróbujmy

df1 = df.set_index(df.groupby(level=0).cumcount(), append=True).unstack()
df1.set_axis(labels=pd.np.arange(len(df1.columns)), axis=1)

Wydajność:

   0  1  2  3
0  a  b  b  c
1  c  d  z  b

Wynik dla df z NaN:

   0     1  2     3
0  a  None  b  None
1  c     d  z     b