520 Stimmen

Wie fügt man eine leere Spalte zu einem Datenrahmen hinzu?

Was ist der einfachste Weg, eine leere Spalte zu einem Pandas DataFrame-Objekt hinzuzufügen? Das beste, was ich gefunden habe, ist so etwas wie

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

Gibt es eine weniger abwegige Methode?

3voto

Bharath_Raja Punkte 612

Sie können tun

df['Spalte'] = None #Das funktioniert. Dadurch wird eine neue Spalte mit dem Typ None erstellt
df.Spalte = None #Das funktioniert nur, wenn die Spalte bereits im DataFrame vorhanden ist

3voto

Adrien Pacifico Punkte 1526

Wenn Sie eine Liste von Spalten haben, die leer sein sollen, können Sie assign verwenden, dann Verständnisdict, dann Dict-Entpackung.

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> nan_cols_name = ["C","D","whatever"]
>>> df.assign(**{col:np.nan for col in nan_cols_name})

   A  B   C   D  whatever
0  1  2 NaN NaN       NaN
1  2  3 NaN NaN       NaN
2  3  4 NaN NaN       NaN

Sie können auch mehrere Dict in einem Dict entpacken, das Sie entpacken möchten, wenn Sie unterschiedliche Werte für verschiedene Spalten möchten.

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
nan_cols_name = ["C","D","whatever"]
empty_string_cols_name = ["E","F","bad column with space"]
df = df.assign(**{
    **{col:np.nan for col in my_empy_columns_name}, 
    **{col:"" for col in empty_string_cols_name}
            }
         )

2voto

moys Punkte 7754

Der unten stehende Code beantwortet die Frage "Wie füge ich meiner vorhandenen Datenrahmen n leere Spalten hinzu". Um Lösungen für ähnliche Probleme an einem Ort zu behalten, füge ich es 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 ist der Datenrahmen, der bereits existiert

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,'')

0voto

吴思位 Punkte 21

Tut mir leid, dass ich meine Antwort am Anfang nicht wirklich gut erklärt habe. Es gibt einen anderen Weg, um eine neue Spalte zu einem vorhandenen DataFrame hinzuzufügen. 1. Schritt: Erstellen Sie ein neues leeres DataFrame (mit allen Spalten in Ihrem DataFrame, plus eine oder mehrere Spalten, die Sie hinzufügen möchten) namens df_temp 2. Schritt: Kombinieren Sie df_temp mit Ihrem DataFrame.

df_temp = pd.DataFrame(columns=(df_null.columns.tolist() + ['empty']))
df = pd.concat([df_temp, df])

Es ist vielleicht die beste Lösung, aber es ist eine weitere Möglichkeit, über diese Frage nachzudenken.

Der Grund, warum ich diese Methode verwende, ist, weil ich die ganze Zeit diese Warnung bekomme:

: SettingWithCopyWarning: 
Es wird versucht, einen Wert in einer Kopie eines Ausschnitts aus einem DataFrame zu setzen.
Versuchen Sie stattdessen .loc[row_indexer,col_indexer] = Wert zu verwenden

Siehe die Hinweise in der Dokumentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df["empty1"], df["empty2"] = [np.nan, ""]

Großartig, ich habe einen Weg gefunden, die Warnung zu deaktivieren

pd.options.mode.chained_assignment = None

0voto

JP1 Punkte 69

Der Grund, warum ich nach einer solchen Lösung gesucht habe, ist einfach, Leerzeichen zwischen mehreren DFs hinzuzufügen, die spaltenweise mit der pd.concat-Funktion verbunden wurden und dann mit xlsxwriter in Excel geschrieben wurden.

df[' ']=df.apply(lambda _: '', axis=1)
df_2 = pd.concat([df,df1],axis=1)                #hat aber nur einmal funktioniert. 
# Hinweis: df & df1 haben dieselben Zeilen, was mein Index ist. 
#
df_2[' ']=df_2.apply(lambda _: '', axis=1)       #hat dieses Mal nicht funktioniert !!?     
df_4 = pd.concat([df_2,df_3],axis=1)

Dann habe ich den zweiten Lambda-Aufruf durch

df_2['']=''                                 #ersetzt, was eine leere Spalte hinzuzufügen scheint
df_4 = pd.concat([df_2,df_3],axis=1)

Die Ausgabe, auf der ich es getestet habe, wurde mit xlsxwriter nach Excel geschrieben. Jupyter-Leerzeilen sehen genauso aus wie in Excel, obwohl sie kein xlsx-Format haben. Nicht sicher, warum der zweite Lambda-Aufruf nicht funktioniert hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X