Ajouter une colonne à la trame de données avec une valeur constante

187

J'ai un dataframe existant auquel je dois ajouter une colonne supplémentaire à laquelle contiendra la même valeur pour chaque ligne.

DF existant:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

Nouveau df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

Je sais comment ajouter une colonne série / dataframe existante. Mais c'est une situation différente, car tout ce dont j'ai besoin est d'ajouter la colonne «Nom» et de définir chaque ligne sur la même valeur, dans ce cas «abc».

Darkpool
la source

Réponses:

295

df['Name']='abc' ajoutera la nouvelle colonne et définira toutes les lignes sur cette valeur:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc
EdChum
la source
35
Y a-t-un autre moyen de faire ça? Je reçois un avertissement suivant. Une valeur tente d'être définie sur une copie d'une tranche à partir d'un DataFrame. Essayez plutôt d'utiliser .loc [row_indexer, col_indexer] = value. Voir les mises en garde dans la documentation: pandas.pydata.org/pandas-docs/stable/…
vishnu viswanath
3
Cela signifie que vous attribuez à quelque chose qui est une copie et non le df original, je ne peux pas commenter davantage sans voir les données et votre code sous la forme d'une question. Répondre aux questions dans les commentaires est contre-productif. Ce code fonctionne, vous avez fait quelque chose avant cela pour lever l'avertissement
EdChum
@vishnuviswanath J'obtiens exactement le même avertissement que vous lorsque j'utilise Jupyter Notebook. Cela m'arrive lorsque j'ai des tailles de DataFrame non triviales (> 200 enregistrements) et certaines combinaisons d'affectation et d'imprimer simplement le df.
Projet de loi le
4
@vishnuviswanath vous avez probablement créé une tranche de la dataframe d'origine avant cela, puis vous avez essayé de définir la nouvelle colonne sur cette tranche. Ajoutez à la place la nouvelle colonne à la trame de données d'origine, puis créez la tranche après cela. Probablement lorsque vous créez une tranche d'une dataframe, les pandas ne créent pas de copie et la gère d'une manière ou d'une autre à partir de la dataframe d'origine. Ce genre de désordre avec cette optimisation, et donc l'avertissement.
amit_saxena
2
Pour contourner l'avertissement pandas mentionné, il suffit d'obtenir une copie du dataframe en utilisant .copy(), avant de l'utiliser (à moins que ce soit énorme ou que quelque chose ou les performances comptent vraiment).
matanster
61

Vous pouvez utiliser insertpour spécifier l'emplacement de la nouvelle colonne. Dans ce cas, j'utilise 0pour placer la nouvelle colonne à gauche.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450
piRSquared
la source
Cela ne fonctionne pas pour moi. Ma matrice d' origine est 1460 x 41 et je tente d'ajouter une colonne de 1 à l'avant: df.insert(0,'coef_fix',1). J'utilise JupyterLab avec Python 3.0
ColinMac
2
Fonctionne bien pour moi. Vous n'avez peut-être pas réalisé que cela insertfonctionne inplace. Cela signifie que la valeur de la nouvelle trame de données n'est pas renvoyée mais que la trame de données d'origine a été modifiée. Essayez cecidf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared
44

Travaux de doublure simple

df['Name'] = 'abc'

Crée une Namecolonne et définit toutes les lignes sur la abcvaleur

Zéro
la source
41

Résumer ce que les autres ont suggéré et ajouter une troisième voie

Vous pouvez:

  • assign (** kwargs) :

    df.assign(Name='abc')
  • accédez à la nouvelle série de colonnes (elle sera créée) et définissez-la:

    df['Name'] = 'abc'
  • insert (loc, colonne, valeur, allow_duplicates = False)

    df.insert(0, 'Name', 'abc')

    où l'argument loc (0 <= loc <= len (colonnes)) vous permet d'insérer la colonne où vous le souhaitez.

    'loc' vous donne l'index auquel votre colonne sera après l'insertion. Par exemple, le code ci-dessus insère la colonne Nom comme 0-ème colonne, c'est-à-dire qu'il sera inséré avant la première colonne, devenant ainsi la nouvelle première colonne. (L'indexation commence à 0).

Toutes ces méthodes vous permettent également d'ajouter une nouvelle colonne à partir d'une série (remplacez simplement l'argument par défaut 'abc' ci-dessus par la série).

Michele Piccolini
la source