Ayant la trame de données suivante, le groupe A a 4 échantillons, B 3 échantillons et C 1 échantillon:
group data_1 data_2
0 A 1 4
1 A 2 5
2 A 3 6
3 A 4 7
4 B 1 4
5 B 2 5
6 B 3 6
7 C 1 4
Je voudrais transformer les données en tableau numpy, où chaque ligne est un groupe avec tous ses échantillons et un remplissage nul pour les groupes qui ont moins d'échantillons.
Résultat dans un tableau comme ceci:
[
[[1,4],[2,5],[3,6],[4,7]], # this is A group 4 samples
[[1,4],[2,5],[3,6],[0,0]], # this is B group 3 samples
[[1,4],[0,0],[0,0],[0,0]], # this is C group 1 sample
]
Il faut d'abord ajouter des valeurs manquantes - première solution avec unstack
et stack
, le compteur Series est créé par cumcount
.
La deuxième solution utilise reindex
par MultiIndex
.
Dernière utilisation de la fonction lambda avec groupby
, conversion en tableau numpy par values
et dernière liste:
g = df.groupby('group').cumcount()
L = (df.set_index(['group',g])
.unstack(fill_value=0)
.stack().groupby(level=0)
.apply(lambda x: x.values.tolist())
.tolist())
print (L)
[[[1, 4], [2, 5], [3, 6], [4, 7]],
[[1, 4], [2, 5], [3, 6], [0, 0]],
[[1, 4], [0, 0], [0, 0], [0, 0]]]
Une autre solution:
g = df.groupby('group').cumcount()
mux = pd.MultiIndex.from_product([df['group'].unique(), g.unique()])
L = (df.set_index(['group',g])
.reindex(mux, fill_value=0)
.groupby(level=0)['data_1','data_2']
.apply(lambda x: x.values.tolist())
.tolist()
)