84 votes

Pandas : Ajouter une ligne à un dataframe et spécifier son étiquette d'indexation

Existe-t-il un moyen de spécifier l'index que je souhaite pour une nouvelle ligne, lors de l'ajout de la ligne à un cadre de données ?

La documentation originale prévoit l'exemple suivant :

In [1301]: df = DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [1302]: df
Out[1302]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946

In [1303]: s = df.xs(3)

In [1304]: df.append(s, ignore_index=True)
Out[1304]: 
          A         B         C         D
0 -1.137707 -0.891060 -0.693921  1.613616
1  0.464000  0.227371 -0.496922  0.306389
2 -2.290613 -1.134623 -1.561819 -0.260838
3  0.281957  1.523962 -0.902937  0.068159
4 -0.057873 -0.368204 -1.144073  0.861209
5  0.800193  0.782098 -1.069094 -1.099248
6  0.255269  0.009750  0.661084  0.379319
7 -0.008434  1.952541 -1.056652  0.533946
8  0.281957  1.523962 -0.902937  0.068159

où la nouvelle ligne reçoit automatiquement l'étiquette d'index. Existe-t-il un moyen de contrôler la nouvelle étiquette ?

70voto

unutbu Points 222216

En name de la série devient le index de la ligne dans le DataFrame :

In [99]: df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])

In [100]: s = df.xs(3)

In [101]: s.name = 10

In [102]: df.append(s)
Out[102]: 
           A         B         C         D
0  -2.083321 -0.153749  0.174436  1.081056
1  -1.026692  1.495850 -0.025245 -0.171046
2   0.072272  1.218376  1.433281  0.747815
3  -0.940552  0.853073 -0.134842 -0.277135
4   0.478302 -0.599752 -0.080577  0.468618
5   2.609004 -1.679299 -1.593016  1.172298
6  -0.201605  0.406925  1.983177  0.012030
7   1.158530 -2.240124  0.851323 -0.240378
10 -0.940552  0.853073 -0.134842 -0.277135

40voto

Alon Points 701

Df.loc fera l'affaire :

>>> df = pd.DataFrame(np.random.randn(3, 2), columns=['A','B'])
>>> df
          A         B
0 -0.269036  0.534991
1  0.069915 -1.173594
2 -1.177792  0.018381
>>> df.loc[13] = df.loc[1]
>>> df
           A         B
0  -0.269036  0.534991
1   0.069915 -1.173594
2  -1.177792  0.018381
13  0.069915 -1.173594

17voto

Harshit Points 191

Je me référerai au même échantillon de données que celui indiqué dans la question :

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
print('The original data frame is: \n{}'.format(df))

En exécutant ce code, vous obtiendrez

The original data frame is:

          A         B         C         D
0  0.494824 -0.328480  0.818117  0.100290
1  0.239037  0.954912 -0.186825 -0.651935
2 -1.818285 -0.158856  0.359811 -0.345560
3 -0.070814 -0.394711  0.081697 -1.178845
4 -1.638063  1.498027 -0.609325  0.882594
5 -0.510217  0.500475  1.039466  0.187076
6  1.116529  0.912380  0.869323  0.119459
7 -1.046507  0.507299 -0.373432 -1.024795

Vous souhaitez maintenant ajouter une nouvelle ligne à ce cadre de données, qui n'a pas besoin d'être une copie d'une autre ligne du cadre de données. @Alon a suggéré une approche intéressante consistant à utiliser df.loc pour ajouter une nouvelle ligne avec un index différent. Le problème, cependant, avec cette approche est que s'il y a déjà une ligne présente à cet index, elle sera écrasée par les nouvelles valeurs. C'est typiquement le cas pour les ensembles de données où l'index des lignes n'est pas unique, comme l'ID du magasin dans les ensembles de données de transaction. Une solution plus générale à votre question est donc de créer la ligne, de transformer les données de la nouvelle ligne en une série pandas, de la nommer selon l'index que vous souhaitez avoir et de l'ajouter à la base de données. N'oubliez pas d'écraser le cadre de données original avec celui contenant la ligne ajoutée. La raison en est la suivante df.append renvoie une vue du cadre de données et ne modifie pas son contenu. Voici le code :

row = pd.Series({'A':10,'B':20,'C':30,'D':40},name=3)
df = df.append(row)
print('The new data frame is: \n{}'.format(df))

Voici le nouveau résultat :

The new data frame is:

           A          B          C          D
0   0.494824  -0.328480   0.818117   0.100290
1   0.239037   0.954912  -0.186825  -0.651935
2  -1.818285  -0.158856   0.359811  -0.345560
3  -0.070814  -0.394711   0.081697  -1.178845
4  -1.638063   1.498027  -0.609325   0.882594
5  -0.510217   0.500475   1.039466   0.187076
6   1.116529   0.912380   0.869323   0.119459
7  -1.046507   0.507299  -0.373432  -1.024795
3  10.000000  20.000000  30.000000  40.000000

7voto

tres.14159 Points 482

Il existe une autre solution. Le code suivant est mauvais (même si je pense que pandas a besoin de cette fonctionnalité) :

import pandas as pd

# empty dataframe
a = pd.DataFrame()
a.loc[0] = {'first': 111, 'second': 222}

Mais le code suivant fonctionne correctement :

import pandas as pd

# empty dataframe
a = pd.DataFrame()
a = a.append(pd.Series({'first': 111, 'second': 222}, name=0))

0voto

egvo Points 98

Mon cas est peut-être différent, mais il est similaire. Je définirais ma propre question comme suit : Comment insérer une ligne avec un nouvel index à une certaine position (donnée) ?

Créons un cadre de données de test :

import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'], index=['x', 'y'])

Résultat :

      A     B
x     1     2
y     3     4

Ensuite, disons que nous voulons placer une nouvelle ligne avec l'index z à la position 1 (deuxième rangée).

pos = 1
index_name = 'z'

# create new indexes where index is at the specified position
new_indexes = df.index.insert(pos, index_name)

# create new dataframe with new row
# specify new index in name argument
new_line = pd.Series({'A': 5, 'B': 6}, name=index_name)
df_new_row = pd.DataFrame([new_line], columns=df.columns)
# append new line to dataframe
df = pd.concat([df, df_new_row])

Maintenant, c'est fini :

      A     B
x     1     2
y     3     4
z     5     6

Maintenant, trions-le en spécifiant la position du nouvel indice :

df = df.reindex(new_indexes)

Résultat :

      A     B
x     1     2
z     5     6
y     3     4

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