2
votes

Diviser les colonnes du cadre de données pandas par valeur de ligne

J'ai un bloc de données comme celui-ci:

  A  B
0 M  M
1 2  2
2 3  3

  A  B
0 N  N
1 20 20
2 30 30

et je dois diviser le bloc de données verticalement par index de ligne 0 = 'M' et 'N':

>df = pd.DataFrame({'A':['M',2,3],'B':['M',2,3],'AA':['N',20,30],'BB':['N',20,30]})
>df = df.rename(columns={df.columns[2]: 'A'})
>df = df.rename(columns={df.columns[3]: 'B'})
>df

  A  B  A  B
0 M  M  N  N
1 2  2  20 20
2 3  3  30 30

Les données du bloc de données proviennent d'une feuille Excel et les noms de colonnes ne sont pas uniques. Merci pour votre aide!


2 commentaires

vous avez besoin de diviser les données en 2 trames de données séparées?


Avez-vous essayé iloc?


3 Réponses :


1
votes

Utilisez pandas iloc pour sélectionner les colonnes:

= ^ .. ^ =

   A  B
0  M  M
1  2  2
2  3  3
    A   B
0   N   N
1  20  20
2  30  30

Résultat:

import pandas as pd

df = pd.DataFrame({'A':['M',2,3],'B':['M',2,3],'AA':['N',20,30],'BB':['N',20,30]})
df = df.rename(columns={df.columns[2]: 'A'})
df = df.rename(columns={df.columns[3]: 'B'})

df1 = df.iloc[:, :2]
df2 = df.iloc[:, 2:]

p>


0 commentaires

1
votes

Utilisez compréhension de liste avec loc comme:

dfs = [df.loc[:, df.loc[0,:].eq(s)] for s in ['M','N']]

Cela donne des cadres de données séparés dans la liste.


0 commentaires

2
votes

Cela devrait faire le travail:

df.loc[:,df.iloc[0, :] == "M"]
df.loc[:,df.iloc[0, :] == "N"]


0 commentaires