[PYTHON] La méthode de copie de pandas.DataFrame est une copie profonde par défaut

La conclusion est comme le dit le titre. Également écrit dans la documentation officielle.

Un collègue a déclaré: «La méthode assign des pandas fait une copie de la trame de données en interne, donc c'est lent et gênant car elle consomme de la mémoire.

Je suis accro à la lecture du "Comité d'éradication du traitement des données Python / pandas pour les affectations récursives" et à l'écriture d'un processus par lots de statistiques en utilisant une chaîne de méthodes. J'ai fait.

Cependant, si vous regardez le code pandas actuel,

#Les commentaires et autres méthodes sont omis
class DataFrame(NDFrame):

    def insert(self, loc, column, value, allow_duplicates=False):
        data = self.copy()

        # do all calculations first...
        results = {}
        for k, v in kwargs.items():
            results[k] = com._apply_if_callable(v, data)

        # ... and then assign
        for k, v in sorted(results.items()):
            data[k] = v

        return data

J'ai pensé: "Oh? La méthode de copie de Python est copie superficielle dans les dictionnaires et les tableaux?" Mais

Par conséquent, lorsque vous utilisez la méthode de copie dans un dictionnaire ou un tableau, les objets à l'intérieur sont les mêmes et la copie des objets à l'intérieur ne consomme pas de mémoire.

a = {'a': [1, 2, 3]}
b = a.copy()

#Le contenu de a et b est le même
assert a['a'] is b['a']

#Les changements destructeurs débordent!
a['a'].append(4)
print(b)
# => {'a': [1, 2, 3, 4]}

La méthode de copie des pandas (et la méthode assign qui l'utilise) semble être préférable pour se soucier de la mémoire lorsqu'il s'agit d'énormes trames de données.

import pandas as pd

df_a = pd.DataFrame({'a': [1, 2, 3]})
df_b = df_a.copy()

#Le contenu de a et b n'est pas le même!
assert df_a['a'] is not df_b['a']

Une demi-blague, j'ai dit à mon collègue que si c'était Haskell, ce ne serait pas un problème car une copie superficielle ne ferait pas de changements destructeurs.

Ceci est un commentaire d'un collègue. Je voudrais savoir s'il existe un style d'écriture à la fois facile à comprendre et qui économise de la mémoire.

[Attention pour éradiquer la substitution récursive des pandas] Je pense qu'il y a de nombreux cas où assign et pipe sont utilisés pour éviter une assignation récursive, mais sachez que assign est une copie de df lui-même, donc ce sera beaucoup plus lent. Par contre, le tuyau n'est pas copié, donc ça va

assign https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492 pipe https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/core/generic.py#L2698-L2708

Cependant, je pense qu'il est vrai que assign est facile à lire comme ui, donc

  • Réduisez le nombre d'assignations autant que possible (il est acceptable d'ajouter plusieurs colonnes avec une assignation car la copie ne se produit pas)
  • Secouez et remplacez récursivement

Je me demande si je peux le faire au mieux ...

Au fait, j'ai réduit les colonnes avant de les passer à assigner, et j'ai essayé concat de convertir le dataframe retourné en dataframe d'origine, mais au contraire, il est devenu assez lent, donc ce n'est pas très bon

Recommended Posts

La méthode de copie de pandas.DataFrame est une copie profonde par défaut
À en juger par l'image du chien Shiba en apprenant en profondeur si c'est mon enfant (1)
cv2.Canny (): Rend le réglage de la détection de bord par la méthode Canny agréable
Malheureusement, il n'y a pas de sens d'unité dans la méthode where
La probabilité de précipitation est-elle correcte?
Science "Saito est-il le représentant de Saito?"
[Détection d'anomalies] Essayez d'utiliser la dernière méthode d'apprentissage à distance
Trouvez le ratio de la superficie du lac Biwa par la méthode de Monte Carlo
Déterminer s'il s'agit de mon enfant à partir de l'image du chien Shiba par apprentissage profond (3) Visualisation par Grad-CAM
Quelle est la méthode Newton? ?? Solution approximative de l'équation à résoudre par la méthode de Newton
Traitement de la voix par apprentissage profond: identifions qui est l'acteur vocal à partir de la voix
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
Compter / vérifier le nombre d'appels de méthode.
Othello-De la troisième ligne de "Implementation Deep Learning" (3)
Quelle est la cause de l'erreur suivante?
Visualisez les effets de l'apprentissage profond / de la régularisation
Pandas du débutant, par le débutant, pour le débutant [Python]
Résumé de la méthode de connexion par DB de SQL Alchemy
La barre oblique arrière du clavier japonais est "ro"
Othello-De la troisième ligne de "Implementation Deep Learning" (2)
Rendre la valeur par défaut de l'argument immuable
[pandas] Lors de la spécification de l'étiquette d'index par défaut dans la méthode at, "" n'est pas requis
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
Le format du message obtenu par Slack API est subtilement difficile à utiliser
Déterminez s'il s'agit de mon enfant à partir de l'image du chien Shiba par apprentissage profond (4) Visualisation par Grad-CAM et Grad-CAM guidé
Recherche de points de selle à l'aide de la méthode du gradient
La première méthode de Monte Carlo en chaîne de Markov par PyStan
J'ai essayé d'augmenter ou de diminuer le nombre en programmant
La méthode de copie de pandas.DataFrame est une copie profonde par défaut
[Pyro] Modélisation statistique par le langage de programmation probabiliste Pyro ① ~ Qu'est-ce que Pyro ~
L'histoire de l'apprentissage profond avec TPU
À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède
À propos du comportement de copy, deepcopy et numpy.copy
Trier les éléments d'un tableau en spécifiant des conditions
L'origine de Manjaro Linux est "Mount Kirimandjaro"
Copiez la liste en Python
FAQ: Pourquoi la comparaison des nombres est-elle incohérente?
La valeur de pyTorch torch.var () n'est pas distribuée
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Rechercher par la valeur de l'instance dans la liste
Ceci est le seul examen de base de Python ~ 3 ~
Apprentissage profond appris par mise en œuvre (segmentation) ~ Mise en œuvre de SegNet ~
Valeur de retour de quit () -Y a-t-il quelque chose retourné par la "fonction qui termine tout"?
Utilisation pour appeler une méthode d'une instance avant qu'elle ne soit renvoyée par __new__
Le moment auquel la valeur de l'argument par défaut est évaluée diffère entre Ruby et Python.