J'ai un dataframe:
file 0 x 1 2 3 1 file1 y 10 20 30 2 ynorm 2 4 6 3 x 1 2 4 4 file2 y 10 20 40 5 ynorm 2 4 8
Je veux l'imprimer pour que:
pour qu'il ressemble à ceci:
import pandas as pd
import numpy as np
data = pd.DataFrame({'file':['file1','file1','file1','file2','file2','file2' ], 'x': [1,2,3,1,2,4], 'y': [10,20,30,10, 20, 40], 'norm_y': [2,4,6,2,4,8]})
print (data)
out:
file x y norm_y
0 file1 1 10 2
1 file1 2 20 4
2 file1 3 30 6
3 file2 1 10 2
4 file2 2 20 4
5 file2 4 40 8
Je pense que la réponse va être quelque chose comme:
5 Réponses :
Il s'agit à la base d'un problème de pivot , mais pas vraiment simple.
key 0 1 2
file
file1 x 1 2 3
y 10 20 30
norm_y 2 4 6
file2 x 1 2 4
y 10 20 40
norm_y 2 4 8
df.assign(
key=df.groupby('file').cumcount()).set_index(['file', 'key']).stack().unstack('key')
Vous pouvez faire:
col 1 2 3
file
file1 norm_y 2 4 6
x 1 2 3
y 10 20 30
file2 norm_y 2 4 8
x 1 2 4
y 10 20 40
Sortie:
df['col' ] = df.groupby('file').cumcount()+1
df.pivot_table(index='file', columns='col').stack(level=0)
Jouer avec numpy remodèle
2 3 4
0 1
file1 norm_y 2 4 6
x 1 2 3
y 10 20 30
file2 norm_y 2 4 8
x 1 2 4
y 10 20 40
fil, var, val = df.melt('file').values.T
new = pd.DataFrame(np.hstack([fil.reshape(-1,3)[:, 0].reshape(-1,1),
var.reshape(-1,3)[:, 0].reshape(-1,1),
val.reshape(-1,3)]))\
.set_index([0,1])\
.sort_index()
vous avez juste besoin d'un peu d'imagination:
file file2 file2 file2
file
file1 x 1 2 3
y 10 20 30
norm_y 2 4 6
file2 x 1 2 4
y 10 20 40
norm_y 2 4 8
Sortie:
data.set_index('file').groupby(level=0).apply(lambda x: x.T)
Vote positif car il semble plus rapide que les autres réponses!
Essayez ceci.
(
pd.melt(data, id_vars='file', value_vars=['x', 'y', 'norm_y']) #Unstacks the data
.groupby(['file', 'variable'])['value'] #restacks with file and variable as index
.aggregate(lambda x: tuple(x)) #splits out values in to a column
.apply(pd.Series) #turns them into separate columns
)
Il y a beaucoup de réponses correctes ci-dessous, ce serait bien de voir les temps d'exécution sur tous si quelqu'un veut essayer.