3 votes

Concaténation de toutes les combinaisons de colonnes de sous-niveau dans un DataFrame pandas

Étant donné le DataFrame suivant :

cols = pd.MultiIndex.from_product([['A', 'B'], ['a', 'b']])
example = pd.DataFrame([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], columns=cols)
example

        A       B
    a   b   a   b
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11

Je voudrais aboutir à la suivante :

    A   B
0   0   2
1   4   6
2   8   10
3   0   3
4   4   7
5   8   11
6   1   2
7   5   6
8   9   10
9   1   3
10  5   7
11  9   11

J'ai utilisé ce code :

concatenated = pd.DataFrame([])
for A_sub_col in ('a', 'b'):
    for B_sub_col in ('a', 'b'):
        new_frame = example[[['A', A_sub_col], ['B', B_sub_col]]]
        new_frame.columns = ['A', 'B']
        concatenated = pd.concat([concatenated, new_frame])

Cependant, je soupçonne fortement qu'il existe un moyen plus direct et idiomatique de le faire avec Pandas. Comment s'y prendre ?

3voto

perl Points 8244

Voici une option utilisant la compréhension des listes :

pd.concat([
    example[[('A', i), ('B', j)]].droplevel(level=1, axis=1)
        for i in example['A'].columns
        for j in example['B'].columns
]).reset_index(drop=True)

Sortie :

    A   B
0   0   2
1   4   6
2   8  10
3   0   3
4   4   7
5   8  11
6   1   2
7   5   6
8   9  10
9   1   3
10  5   7
11  9  11

1voto

piterbarg Points 5113

Voici un moyen. Je ne sais pas si elle est plus pythique. Elle est certainement moins lisible :-) mais d'un autre côté, elle n'utilise pas de boucles explicites :

(example
    .apply(lambda c: [list(c)])
    .stack(level=1)
    .apply(lambda c:[list(c)])
    .explode('A')
    .explode('B')
    .apply(pd.Series.explode)
    .reset_index(drop = True)
)

pour comprendre ce qui se passe, il serait utile de procéder étape par étape, mais le résultat final est

    A   B
0   0   2
1   4   6
2   8   10
3   0   3
4   4   7
5   8   11
6   1   2
7   5   6
8   9   10
9   1   3
10  5   7
11  9   11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X