Ich hätte erwartet, dass Ihre Syntax auch funktioniert. Das Problem tritt auf, weil df[[new1, new2]] = ...
Pandas beim Erstellen neuer Spalten mit der Spaltenlistensyntax ( ) erfordert, dass die rechte Seite ein DataFrame ist (beachten Sie, dass es eigentlich keine Rolle spielt, ob die Spalten des DataFrame dieselben Namen wie die Spalten haben Sie erstellen).
Ihre Syntax eignet sich gut zum Zuweisen von Skalarwerten zu vorhandenen Spalten, und Pandas vergibt auch gerne Skalarwerte zu einer neuen Spalte mithilfe der einspaltigen Syntax ( df[new1] = ...
). Die Lösung besteht also entweder darin, dies in mehrere einspaltige Zuweisungen zu konvertieren oder einen geeigneten DataFrame für die rechte Seite zu erstellen.
Hier sind einige Ansätze, die funktionieren werden:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Dann eine der folgenden:
1) Drei Aufgaben in einer, wobei die Liste entpackt wird:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) DataFrame
Erweitert bequemerweise eine einzelne Zeile, um sie an den Index anzupassen. So können Sie Folgendes tun:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3) Erstellen Sie einen temporären Datenrahmen mit neuen Spalten und kombinieren Sie ihn später mit dem ursprünglichen Datenrahmen:
df = pd.concat(
[
df,
pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
)
], axis=1
)
4) Ähnlich wie beim vorherigen, jedoch join
anstelle von concat
(möglicherweise weniger effizient):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5) Die Verwendung eines Diktats ist eine "natürlichere" Methode zum Erstellen des neuen Datenrahmens als die beiden vorherigen, aber die neuen Spalten werden alphabetisch sortiert (zumindest vor Python 3.6 oder 3.7 ):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6) Verwendung .assign()
mit mehreren Spaltenargumenten.
Ich mag diese Variante der Antwort von @ zero sehr, aber wie die vorherige werden die neuen Spalten immer alphabetisch sortiert, zumindest bei früheren Versionen von Python:
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
7) Das ist interessant (basierend auf https://stackoverflow.com/a/44951376/3830997 ), aber ich weiß nicht, wann es die Mühe wert wäre:
new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
new_vals = [np.nan, 'dogs', 3]
df = df.reindex(columns=df.columns.tolist() + new_cols) # add empty cols
df[new_cols] = new_vals # multi-column assignment works for existing cols
8) Am Ende ist es schwer, drei separate Aufgaben zu meistern:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Hinweis: Viele dieser Optionen wurden bereits in anderen Antworten behandelt: Fügen Sie DataFrame mehrere Spalten hinzu und setzen Sie sie auf eine vorhandene Spalte . Ist es möglich, einem Pandas DataFrame mehrere Spalten gleichzeitig hinzuzufügen? , Fügen Sie Pandas DataFrame mehrere leere Spalten hinzu
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"