88 votes

Comment ajouter un seul élément à une série Pandas ?

Comment ajouter un seul élément à une série sérialisée de pandas. Je sais que ce n'est pas le moyen le plus efficace en termes de mémoire, mais j'ai quand même besoin de le faire.

Quelque chose comme ça :

>> x = Series()
>> N = 4
>> for i in xrange(N):
>>     x.some_appending_function(i**2)    
>> print x

0 | 0
1 | 1
2 | 4
3 | 9

Par ailleurs, comment puis-je ajouter une seule ligne à un DataFrame de Pandas ?

48voto

joaquin Points 22450

Comment ajouter un seul élément. Ce n'est pas très efficace mais cela correspond à ce que vous demandez :

x = p.Series()
N = 4
for i in xrange(N):
   x = x.set_value(i, i**2)

produit x :

0    0
1    1
2    4
3    9

Il existe manifestement de meilleures façons de générer cette série en une seule fois.

Pour votre deuxième question, vérifiez la réponse et les références de la question SO. ajouter une ligne dans un pandas.DataFrame .

47voto

newtover Points 12301

TLDR : n'ajoutez pas les éléments à une série un par un, il est préférable d'utiliser une collection ordonnée.

Je pense que la question, dans sa forme actuelle, est un peu délicate. Et la réponse acceptée répond effectivement à la question. Mais plus j'utilise les pandas, plus je comprends que c'est une mauvaise idée d'ajouter des éléments à une série un par un. Je vais essayer d'expliquer pourquoi aux débutants en pandas.

Vous pourriez penser que l'ajout de données à une série donnée pourrait vous permettre de réutiliser certaines ressources, mais en réalité, une série n'est qu'un conteneur qui stocke une relation entre un index et un tableau de valeurs. Chaque tableau est un numpy.array, et l'index est immuable. Lorsque vous ajoutez à Series un élément dont l'étiquette est manquante dans l'index, un nouvel index de taille n+1 est créé, et un nouveau tableau de valeurs de la même taille. Cela signifie que lorsque vous ajoutez des éléments un par un, vous créez deux tableaux supplémentaires de taille n+1 à chaque étape.

Par ailleurs, vous ne pouvez pas ajouter un nouvel élément par position (vous obtiendrez une IndexError) et l'étiquette dans un index ne doit pas être unique, c'est-à-dire que lorsque vous attribuez une valeur avec une étiquette, vous attribuez la valeur à tous les éléments existants avec l'étiquette, et une nouvelle ligne n'est pas ajoutée dans ce cas. Cela peut entraîner des bogues subtils.

La morale de l'histoire est que vous ne devriez pas ajouter les données une par une, mais plutôt les étendre avec une collection ordonnée. Le problème est que vous ne pouvez pas étendre une série in situ. C'est pourquoi il est préférable d'organiser votre code de manière à ne pas avoir à mettre à jour une instance spécifique d'une série par référence.

Si vous créez vous-même les étiquettes et qu'elles augmentent, le plus simple est d'ajouter de nouveaux éléments à un dictionnaire, puis de créer une nouvelle série à partir du dictionnaire (il trie les clés) et d'ajouter la série à une ancienne. Si les clés ne sont pas croissantes, vous devrez créer deux listes distinctes pour les nouvelles étiquettes et les nouvelles valeurs.

Vous trouverez ci-dessous quelques exemples de code :

In [1]: import pandas as pd
In [2]: import numpy as np

In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4))

In [4]: s
Out[4]:
0    0
1    1
2    4
3    9
dtype: int64

In [6]: id(s.index), id(s.values)
Out[6]: (4470549648, 4470593296)

Lorsque nous mettons à jour un élément existant, l'index et le tableau des valeurs restent les mêmes (si vous ne changez pas le type de la valeur).

In [7]: s[2] = 14  

In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)

Mais lorsque vous ajoutez un nouvel élément, un nouvel index et un nouveau tableau de valeurs sont générés :

In [9]: s[4] = 16

In [10]: s
Out[10]:
0     0
1     1
2    14
3     9
4    16
dtype: int64

In [11]: id(s.index), id(s.values)
Out[11]: (4470548560, 4470595056)

En d'autres termes, si vous voulez ajouter plusieurs éléments, rassemblez-les dans un dictionnaire, créez une série, ajoutez-la à l'ancienne et enregistrez le résultat :

In [13]: new_items = {item: item**2 for item in range(5, 7)}

In [14]: s2 = pd.Series(new_items)

In [15]: s2  # keys are guaranteed to be sorted!
Out[15]:
5    25
6    36
dtype: int64

In [16]: s = s.append(s2); s
Out[16]:
0     0
1     1
2    14
3     9
4    16
5    25
6    36
dtype: int64

34voto

user2831683 Points 819

Si vous avez un indice et une valeur. Alors vous pouvez ajouter à Series comme :

obj = Series([4,7,-5,3])
obj.index=['a', 'b', 'c', 'd']

obj['e'] = 181

cela ajoutera une nouvelle valeur à Series (à la fin de Series).

15voto

fixxxer Points 1136

Vous pouvez utiliser la fonction append pour y ajouter un autre élément. Seulement, faites une série du nouvel élément, avant de l'ajouter :

test = test.append(pd.Series(200, index=[101]))

7voto

Jaroslav Bezděk Points 2707

Pour ce qui est de @joaqin solution est déprécié, car set_value sera supprimée dans une prochaine version de pandas, je mentionnerais l'autre option permettant d'ajouter un seul élément aux séries de pandas, en utilisant la méthode .at[] accesseur.

>>> import pandas as pd
>>> x = pd.Series()
>>> N = 4
>>> for i in range(N):
...     x.at[i] = i**2

Il produit le même résultat.

>>> print(x)
0    0
1    1
2    4
3    9

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X