J'ai une trame de données pandas (X11) comme celle-ci: en réalité, j'ai 99 colonnes jusqu'à dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Je veux créer des colonnes supplémentaires pour des valeurs de cellule comme 25041,40391,5856 etc. Il y aura donc une colonne 25041 avec la valeur 1 ou 0 si 25041 se produit dans cette ligne particulière dans les colonnes dxs. J'utilise ce code et cela fonctionne lorsque le nombre de lignes est inférieur.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
J'obtiens un résultat comme celui-ci:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Lorsque le nombre de lignes est de plusieurs milliers ou de millions, cela se bloque et prend une éternité et je n'obtiens aucun résultat. Veuillez noter que les valeurs des cellules ne sont pas uniques à la colonne, mais plutôt répétées dans plusieurs colonnes. Par exemple, 40391 se produit dans dx1 ainsi que dans dx2 et ainsi de suite pour 0 et 5856 etc. Une idée comment améliorer la logique mentionnée ci-dessus?
Réponses:
Il y a une solution beaucoup plus pythonique dans les pandas ...
Cela prend moins d'une seconde sur 10 millions de lignes sur mon ordinateur portable:
Voici les détails présentés:
Petite trame de données simple -
Méthode de binarisation -
Cadre de données avec 10 millions de lignes -
Binarisation temporisée (aka codage à chaud) sur 10 millions de lignes de données -
J'espère que cela t'aides!
la source
Il semble que vous souhaitiez créer une variable fictive à partir d'une colonne de trame de données pandas. Heureusement, a Pandas une méthode spéciale pour elle:
get_dummies()
. Voici un extrait de code que vous pouvez adapter à vos besoins:Voici la sortie de
data_transformed
:la source