web-dev-qa-db-fra.com

Ajouter une nouvelle ligne à un Pandas DataFrame avec un nom d'index spécifique

J'essaie d'ajouter une nouvelle ligne au DataFrame avec un nom d'index spécifique 'e'.

    number   variable       values
a    NaN       bank          true   
b    3.0       shop          false  
c    0.5       market        true   
d    NaN       government    true   

J'ai essayé ce qui suit, mais il crée une nouvelle colonne au lieu d'une nouvelle ligne. 

new_row = [1.0, 'hotel', 'true']
df = df.append(new_row)

Vous ne comprenez toujours pas comment insérer la ligne avec un index spécifique. Sera reconnaissant pour toutes les suggestions.

14
samba

Vous pouvez utiliser df.loc[_not_yet_existing_index_label_] = new_row.

Démo:

In [3]: df.loc['e'] = [1.0, 'hotel', 'true']

In [4]: df
Out[4]:
   number    variable values
a     NaN        bank   True
b     3.0        shop  False
c     0.5      market   True
d     NaN  government   True
e     1.0       hotel   true

PS en utilisant cette méthode, vous ne pouvez pas ajouter une ligne avec une valeur d'index (étiquette) déjà existante (en double) - une ligne avec cette étiquette d'index sera updated dans ce cas.


METTRE À JOUR:

Cela pourrait ne pas fonctionner dans les Pandas/Python3 récents si l’index est un DateTimeIndex et l'index de la nouvelle ligne n'existent pas.

cela fonctionnera si nous spécifions la ou les valeurs d'index correctes.

Démo (en utilisant pandas: 0.23.4):

In [17]: ix = pd.date_range('2018-11-10 00:00:00', periods=4, freq='30min')

In [18]: df = pd.DataFrame(np.random.randint(100, size=(4,3)), columns=list('abc'), index=ix)

In [19]: df
Out[19]:
                      a   b   c
2018-11-10 00:00:00  77  64  90
2018-11-10 00:30:00   9  39  26
2018-11-10 01:00:00  63  93  72
2018-11-10 01:30:00  59  75  37

In [20]: df.loc[pd.to_datetime('2018-11-10 02:00:00')] = [100,100,100]

In [21]: df
Out[21]:
                       a    b    c
2018-11-10 00:00:00   77   64   90
2018-11-10 00:30:00    9   39   26
2018-11-10 01:00:00   63   93   72
2018-11-10 01:30:00   59   75   37
2018-11-10 02:00:00  100  100  100

In [22]: df.index
Out[22]: DatetimeIndex(['2018-11-10 00:00:00', '2018-11-10 00:30:00', '2018-11-10 01:00:00', '2018-11-10 01:30:00', '2018-11-10 02:00:00'], dtype='da
tetime64[ns]', freq=None)
26
MaxU

Utilisez append en convertissant list a dataframe si vous souhaitez ajouter plusieurs lignes à la fois, i.e 

df = df.append(pd.DataFrame([new_row],index=['e'],columns=df.columns))

Ou pour une seule rangée (Merci @Zero)

df = df.append(pd.Series(new_row, index=df.columns), name='e') #EDIT: there was a missing ')'

Sortie: 

 nombre de valeurs variables 
 a Banque NaN Vrai 
 b 3.0 boutique Faux 
 c 0,5 marché Vrai 
 d NaN gouvernement Vrai 
 e 1.0 hotel vrai 
8
Dark

Si c'est la première rangée dont vous avez besoin:

df = Dataframe(columns=[number, variable, values])
df.loc['e', [number, variable, values]] = [1.0, 'hotel', 'true']
0
Kim Miller