Wie füge ich einem Datenrahmen eine leere Spalte hinzu?

259

Was ist der einfachste Weg, einem Pandas- DataFrameObjekt eine leere Spalte hinzuzufügen ? Das Beste, über das ich gestolpert bin, ist so etwas wie

df['foo'] = df.apply(lambda _: '', axis=1)

Gibt es eine weniger perverse Methode?

kjo
quelle
2
Möchten Sie tatsächlich eine Spalte mit leeren Zeichenfolgen oder besser gesagt N/A?
Film oder

Antworten:

418

Wenn ich richtig verstehe, sollte die Aufgabe Folgendes füllen:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
DSM
quelle
2
Diese Antwort hat gerade neue Zeilen für mich erstellt.
Logicbloke
@logicbloke können Sie ein Beispiel geben, wo dies geschieht?
Craymichael
@craymichael Es ist eine Weile her, aber ich glaube, ich hatte nummerierte Spalten ohne Namen und benannte Zeilen und es wurde am Ende nur eine neue Zeile erstellt.
Logicbloke
1
Wenn das dfleer ist, können Sie verwenden df['new'] = pd.Series() (siehe meine Antwort unten)
Carsten
Wie füge ich mehrere leere Spalten hinzu?
M. Mariscal
46

Um die Antwort von DSM zu ergänzen und auf dieser zugehörigen Frage aufzubauen, würde ich den Ansatz in zwei Fälle aufteilen:

  • Hinzufügen einer einzelnen Spalte: Weisen Sie den neuen Spalten einfach leere Werte zu, z df['C'] = np.nan

  • Hinzufügen mehrerer Spalten: Ich würde vorschlagen, die .reindex(columns=[...]) Pandas-Methode zu verwenden, um die neuen Spalten zum Spaltenindex des Datenrahmens hinzuzufügen. Dies funktioniert auch zum Hinzufügen mehrerer neuer Zeilen mit .reindex(rows=[...]). Beachten Sie, dass neuere Versionen von Pandas (v> 0,20) können Sie ein angeben , axiseher Stichwort als explizit zuweisen columnsoder rows.

Hier ist ein Beispiel zum Hinzufügen mehrerer Spalten:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

oder

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Sie können auch immer einen neuen (leeren) Datenrahmen mit dem vorhandenen Datenrahmen verknüpfen, aber das fühlt sich für mich nicht pythonisch an :)

emunsing
quelle
3
Beispiel für version >= 0.20.0das Löschen des DataFrame und das Hinzufügen der neuen Spalten als Zeilen. Beispiel für version < 0.20.0funktioniert gut auf Pandas Version0.24.1
Lalo
@emunsing Bei der Suche nach einer Antwort auf diese Frage fand ich Ihre Antwort letztendlich hilfreich. Zunächst aber war es nicht für mich arbeiten , wie Pandas erfordert , axis=1in version = 0.25. Ich habe versucht, Ihre Antwort so zu ändern, dass sie die aktualisierte Version enthält, wurde jedoch von @kenlukas und @il_raffa abgelehnt. Ich hoffe, dass jeder, der Schwierigkeiten hat zu verstehen, warum Ihre Antwort für ihn nicht funktioniert - so wie ich - zumindest auf diesen Kommentar stößt.
Griff
@Griff - Ich habe meine Antwort jetzt aktualisiert, um Probleme mit der Versionskompatibilität genauer und expliziter zu behandeln. Vielen Dank, dass Sie dies hervorgehoben haben.
Emunsing
35

Eine noch einfachere Lösung ist:

df = df.reindex(columns = header_list)                

Dabei ist "header_list" eine Liste der Header, die angezeigt werden sollen.

Alle in der Liste enthaltenen Header, die noch nicht im Datenrahmen enthalten sind, werden mit leeren Zellen unten hinzugefügt.

also wenn

header_list = ['a','b','c', 'd']

dann werden c und d als Spalten mit leeren Zellen hinzugefügt

Liane
quelle
2
Genauer gesagt werden die Spalten mit NaNs hinzugefügt.
Broccoli2000
18

Beginnend mit v0.16.0, DF.assign()könnte verwendet werden , um neue Spalten (zuweisen single / multiple ) zu ein DF. Diese Spalten werden am Ende der Liste in alphabetischer Reihenfolge eingefügt DF.

Dies ist im Vergleich zur einfachen Zuweisung in Fällen vorteilhaft, in denen Sie eine Reihe verketteter Operationen direkt am zurückgegebenen Datenrahmen ausführen möchten.

Betrachten Sie dasselbe DFBeispiel, das von @DSM demonstriert wurde:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Beachten Sie, dass dies eine Kopie mit allen vorherigen Spalten zusammen mit den neu erstellten zurückgibt. Um das Original entsprechend DFzu ändern, verwenden Sie es wie df = df.assign(...)folgt : Da es den inplaceBetrieb derzeit nicht unterstützt .

Nickil Maveli
quelle
Was ist dieser Datentyp für C? Ich versuche hinzuzufügen, indem ich eine Liste von Zeichenfolgen durchlaufe. Aber es benutzt es nicht.
Eleijonmarck
12

Ich mag:

df['new'] = pd.Series(dtype='your_required_dtype')

Wenn Sie einen leeren Datenrahmen haben, stellt diese Lösung sicher, dass keine neue Zeile NaNhinzugefügt wird, die nur enthält .

Wenn dtypenicht angegeben, erzeugen neuere Pandas-Versionen a DeprecationWarning.

Carsten
quelle
5

Wenn Sie einen Spaltennamen aus einer Liste hinzufügen möchten

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan
Joy Mazumder
quelle
4

Die Antwort von @ emunsing ist wirklich cool, um mehrere Spalten hinzuzufügen, aber ich konnte sie in Python 2.7 nicht zum Laufen bringen. Stattdessen fand ich, dass dies funktioniert:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
Randfall
quelle
1

Der folgende Code behandelt die Frage "Wie füge ich meinem vorhandenen Datenrahmen n leere Spalten hinzu?". Um Lösungen für ähnliche Probleme an einem Ort zu halten, füge ich sie hier hinzu.

Ansatz 1 (um 64 zusätzliche Spalten mit Spaltennamen von 1-64 zu erstellen)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Ansatz 2 (um 64 zusätzliche Spalten mit Spaltennamen von 1-64 zu erstellen)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
Moys
quelle
1

Du kannst tun

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 
Bharath_Raja
quelle
1

Man kann df.insert(index_to_insert_at, column_header, init_value)eine neue Spalte an einem bestimmten Index einfügen.

cost_tbl.insert(1, "col_name", "") 

Die obige Anweisung würde eine leere Spalte nach der ersten Spalte einfügen.

Usman Ahmad
quelle