1
votes

Division avancée Pandas Dataframe

J'ai un grand DataFrame que je dois diviser en deux (A et B), avec le même nombre de lignes à partir d'une certaine valeur de colonne dans A et B. Cette colonne a plus de 700 valeurs uniques, toutes des chaînes. Je laisse un exemple:

A
  Price  Type
  1      X
  5      X
  2      Y
  3      Y

B
  Price  Type
  4      X
  6      X
  7      Y
  8      Y

Lors du fractionnement (au hasard), je devrais obtenir deux valeurs de X, et deux valeurs de Y dans DataFrame A et DataFrame B, comme:

XXX

Merci d'avance!


2 commentaires

Comment les catégories ( X , Y , etc.) sont-elles réparties?


Inégalement. Il y a plus de 2000 valeurs d'une et 4 autres.


3 Réponses :


1
votes

Pourriez-vous grouper par la valeur de Type et attribuer A / B à la moitié du groupe en tant que nouvelle colonne, puis copier uniquement les lignes avec l'étiquette A / B attribuée? Si vous avez besoin d'une répartition exacte, vous pouvez la baser sur la taille du groupe


1 commentaires

Cela pourrait être une bonne idée, mais je ne sais pas comment pourrais-je la mettre en œuvre.



0
votes

Vous pouvez utiliser la fonction "arry_split" de la bibliothèque numpy comme ci-dessous:

import numpy as np
df_split = np.array_split(df, 2)
df1 = df_split[0]
df2 = df_split[1]


2 commentaires

Désolé, cela ne fonctionne pas, il divise le bloc de données en deux et la distribution n'est pas symétrique


Ce code sera divisé en deux. Si le nombre total d'enregistrements est pair, la distribution de deux blocs de données sera égale. Si le nombre total d'enregistrements est impair, le premier df aura un enregistrement de plus que le second df. Parce que vous ne pouvez pas distribuer un nombre impair de df en deux df de manière égale.



2
votes

Vous pouvez utiliser groupby (). cumcount () pour énumérer les lignes dans Type , puis % 2 pour diviser les lignes en deux groupes :

**A**

   Price Type  groups
0      1    X       0
1      2    Y       0
4      5    X       0
6      7    Y       0

**B**

   Price Type  groups
2      3    Y       1
3      4    X       1
5      6    X       1
7      8    Y       1

Résultat:

df['groups'] = df.groupby('Type').cumcount()%2

A,B = df[df['groups']==0], df[df['groups']==1]


1 commentaires

Merci pour la réponse. Malheureusement, il donne un 0 pour le premier élément de chaque colonne, pas un 0 pour chaque élément d'une certaine valeur de colonne. Néanmoins, cela m'a donné une idée de continuer et cela a rendu les choses plus faciles à coup sûr!