web-dev-qa-db-fra.com

Pandas - grouper par colonne et transformer les données en tableau numpy

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
]
10
Shlomi Schwartz

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()
)
8
jezrael