Fügen Sie dem Datenrahmen eine Spalte mit dem Standardwert hinzu

186

Ich habe einen vorhandenen Datenrahmen, dem ich eine zusätzliche Spalte hinzufügen muss, die für jede Zeile den gleichen Wert enthält.

Bestehende df:

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

Neues df:

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

Ich kann eine vorhandene Serien- / Datenrahmenspalte anhängen. Dies ist jedoch eine andere Situation, da ich lediglich die Spalte 'Name' hinzufügen und jede Zeile auf den gleichen Wert setzen muss, in diesem Fall 'abc'.

Darkpool
quelle

Antworten:

293

df['Name']='abc' fügt die neue Spalte hinzu und setzt alle Zeilen auf diesen Wert:

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
quelle
34
Gibt es eine andere Möglichkeit, dies zu tun? Ich bekomme folgende Warnung. Ein Wert versucht, auf einer Kopie eines Slice aus einem DataFrame festgelegt zu werden. Versuchen Sie stattdessen, .loc [row_indexer, col_indexer] = value zu verwenden. Siehe die Vorbehalte in der Dokumentation: pandas.pydata.org/pandas-docs/stable/…
vishnu viswanath
3
Das bedeutet, dass Sie etwas zuweisen, das eine Kopie und nicht das Original df ist. Ich kann nicht weiter kommentieren, ohne Daten und Ihren Code in Form einer Frage zu sehen. Das Beantworten von Fragen in Kommentaren ist kontraproduktiv. Dieser Code funktioniert, Sie haben zuvor etwas getan, um die Warnung
auszulösen
@vishnuviswanath Ich erhalte genau die gleiche Warnung wie Sie, wenn ich Jupyter Notebook verwende. Es passiert mir, wenn ich nicht triviale DataFrame-Größen (> 200 Datensätze) und bestimmte Zuordnungskombinationen habe und einfach die df ausdrucke.
Bill
4
@vishnuviswanath Sie haben wahrscheinlich zuvor ein Slice des ursprünglichen Datenrahmens erstellt und dann versucht, die neue Spalte für dieses Slice festzulegen. Fügen Sie stattdessen die neue Spalte zum ursprünglichen Datenrahmen hinzu und erstellen Sie anschließend das Slice. Wenn Sie ein Slice eines Datenrahmens erstellen, erstellt Pandas wahrscheinlich keine Kopie und verwaltet sie irgendwie aus dem ursprünglichen Datenrahmen. Diese Art von Unordnung mit dieser Optimierung und damit der Warnung.
amit_saxena
2
Um die erwähnte Pandas-Warnung zu umgehen, holen Sie sich einfach eine Kopie des Datenrahmens .copy(), bevor Sie diesen verwenden (es sei denn, er ist riesig oder etwas oder die Leistung zählt wirklich).
Matanster
61

Mit können Sie insertangeben, wo sich eine neue Spalte befinden soll. In diesem Fall platziere ich 0die neue Spalte links.

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

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450
piRSquared
quelle
Das funktioniert bei mir nicht. Meine ursprüngliche Matrix ist 1460 x 41 und ich versuche, eine Spalte mit Einsen nach vorne einzufügen : df.insert(0,'coef_fix',1). Ich benutze JupyterLab mit Python 3.0
ColinMac
2
Funktioniert gut für mich. Möglicherweise haben Sie nicht bemerkt, dass dies insertfunktioniert inplace. Dies bedeutet, dass der Wert des neuen Datenrahmens nicht zurückgegeben wird, sondern der ursprüngliche Datenrahmen geändert wurde. Versuchen Sie diesdf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared
43

Single Liner funktioniert

df['Name'] = 'abc'

Erstellt eine NameSpalte und setzt alle Zeilen auf abcWert

Null
quelle
41

Fassen Sie zusammen, was die anderen vorgeschlagen haben, und fügen Sie einen dritten Weg hinzu

Sie können:

  • zuweisen (** kwargs) :

    df.assign(Name='abc')
  • Greifen Sie auf die neue Spaltenreihe zu (sie wird erstellt) und legen Sie sie fest:

    df['Name'] = 'abc'
  • Einfügen (loc, column, value, allow_duplicates = False)

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

    Mit dem Argument loc (0 <= loc <= len (Spalten)) können Sie die gewünschte Spalte einfügen.

    ‚loc‘ gibt Ihnen den Index , dass Ihre Spalte sein nach dem Einsetzen. Im obigen Code wird beispielsweise der Spaltenname als 0. Spalte eingefügt, dh er wird vor der ersten Spalte eingefügt und wird zur neuen ersten Spalte. (Die Indizierung beginnt bei 0).

Mit all diesen Methoden können Sie auch eine neue Spalte aus einer Reihe hinzufügen (ersetzen Sie einfach das Standardargument 'abc' oben durch die Reihe).

Michele Piccolini
quelle