3
votes

Comment amener quatre colonnes de données Excel en deux lignes dans Pandas

J'ai des données dans quatre colonnes dans Excel, à transposer sur deux lignes. La première colonne à être la ligne d'en-tête pour les données dans la deuxième colonne et la troisième colonne à être l'en-tête des données dans la quatrième colonne comme ci-dessous:

Les données sont comme ci-dessous

A  B  C D  E  F  G  H  I  J  K  L
1  2  3 4  5  6  7  8  9  10 11 12 

Et besoin de transposer

A    1      G   7
B    2      H   8
C    3      I   9
D    4      J   10
E    5      K   11
F    6      L   12

Appréciant vos précieuses contributions.


0 commentaires

3 Réponses :


2
votes

Pour une solution générale fonctionnant avec 4 , 6 , 10 colonnes, sélectionnez les paires et dissociez les colonnes en les indexant, aplatissez dans le tableau numpy et passez au constructeur DataFrame :

a = np.arange(len(df.columns))

df.columns = [a % 2, a // 2]
df = (df.stack()
        .sort_index(level=1)
        .set_index(0)[[1]]
        .T
        .rename_axis(None, axis=1)
        .reset_index(drop=True))
print (df)
   A  B  C  D  E  F  G  H  I   J   K   L
0  1  2  3  4  5  6  7  8  9  10  11  12

Ou si vous voulez utiliser la solution pandas, créez MultiIndex par division modulo et entière de np.arange par longueur de colonnes, puis remodelez-vous par DataFrame.stack , puis transposez et nettoyez les données:

c = df.iloc[:, ::2].T.to_numpy().ravel()
v = df.iloc[:, 1::2].T.to_numpy().ravel()

df = pd.DataFrame([v], columns=c)
print (df)
   A  B  C  D  E  F  G  H  I   J   K   L
0  1  2  3  4  5  6  7  8  9  10  11  12


2 commentaires

Merci @jezrael


@ArifKassim - Il n'y a donc que 4 colonnes? Et pas besoin de solution générale? Parce qu'une seule réponse doit être acceptée, pas les deux.



2
votes

Utilisez pd.concat et transpose(.T) :

In [2139]: d = pd.concat([df.iloc[:, :2].T.reset_index(drop=True), df.iloc[:, 2:].T.reset_index(drop=True)],1)

In [2144]: d.columns = d.loc[0]

In [2147]: d = d.drop(0)

In [2148]: d
Out[2148]: 
0  A  B  C  D  E  F  G  H  I   J   K   L
1  1  2  3  4  5  6  7  8  9  10  11  12


2 commentaires

Merci @Mayank Porwal


@ArifKassim Heureux de vous aider. N'oubliez pas de voter également pour la réponse.



1
votes

Vous pouvez utiliser np.reshape , np.vstack , puis set_index et Transpose :

>>> pd.DataFrame(np.vstack(np.split(df, 2, axis=1))).set_index(0).T

0  A  B  C  D  E  F  G  H  I   J   K   L
1  1  2  3  4  5  6  7  8  9  10  11  12


2 commentaires

Impressionnant. C'est merveilleux. J'ai essayé les trois solutions. Je suis novice en python et en programmation dans son ensemble. C'était ma première question ici et j'ai eu une très bonne réponse. Merci, @Sayandip Dutta


@ArifKassim vous êtes les bienvenus. Chez SO, si vous posez une question décente, vous obtiendrez presque toujours de l'aide. Si cela fonctionne, vous pouvez envisager de voter pour.