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