Ausgabe
Ich bin neu bei Pandas und versuche herauszufinden, wie ich Pandas mehrere Spalten gleichzeitig hinzufügen kann. Jede Hilfe ist hier willkommen. Idealerweise würde ich dies in einem Schritt tun und nicht in mehreren wiederholten Schritten …
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
Lösung
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 ( ) verlangt, 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 du erschaffst).
Ihre Syntax funktioniert gut, um vorhandenen Spalten skalare Werte zuzuweisen, und pandas weist auch gerne skalare Werte einer neuen Spalte mit der einspaltigen Syntax ( df[new1] = ...
) zu. Die Lösung besteht also darin, dies entweder in mehrere einspaltige Zuweisungen umzuwandeln oder einen geeigneten DataFrame für die rechte Seite zu erstellen.
Hier sind mehrere Ansätze, die funktionieren:
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, mit Listenentpacken:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) DataFrame
erweitert bequem eine einzelne Zeile, damit sie mit dem Index übereinstimmt, sodass Sie dies tun können:
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 im vorherigen, aber mit join
statt 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 bei der vorherigen werden die neuen Spalten immer alphabetisch sortiert, zumindest bei frühen 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 schlagen:
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 mehrere Spalten zu DataFrame hinzu und setzen Sie sie einer vorhandenen Spalte gleich . Ist es möglich, einem Pandas-DataFrame mehrere Spalten gleichzeitig hinzuzufügen? , Fügen Sie pandas DataFrame mehrere leere Spalten hinzu
Beantwortet von – Matthias Fripp
Antwort geprüft von – Willingham (FixError Volunteer)