Ich bin neu in Pandas und versuche herauszufinden, wie man Pandas mehrere Spalten gleichzeitig hinzufügt. Jede Hilfe hier wird geschätzt. Idealerweise möchte 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...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Antworten:
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:
Dann eine der folgenden:
1) Drei Aufgaben in einer, wobei die Liste entpackt wird:
2)
DataFrame
Erweitert bequemerweise eine einzelne Zeile, um sie an den Index anzupassen. So können Sie Folgendes tun:3) Erstellen Sie einen temporären Datenrahmen mit neuen Spalten und kombinieren Sie ihn später mit dem ursprünglichen Datenrahmen:
4) Ähnlich wie beim vorherigen, jedoch
join
anstelle vonconcat
(möglicherweise weniger effizient):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 ):
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:
7) Das ist interessant (basierend auf https://stackoverflow.com/a/44951376/3830997 ), aber ich weiß nicht, wann es die Mühe wert wäre:
8) Am Ende ist es schwer, drei separate Aufgaben zu meistern:
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
quelle
.reindex
) den Index des Datenrahmens nicht ändern? Warum sollte jemand den Index beim Hinzufügen von Spalten unnötig ändern wollen, es sei denn, dies ist ein explizites Ziel ....reindex()
wird mit demcolumns
Argument verwendet, so dass nur die Spalte "Index" (Namen) geändert wird. Der Zeilenindex wird nicht geändert.OrderedDict
df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, stellen Sie sicher, dass Ihr Index keine Duplikate enthält (oder verwenden Sie einereset_index
erste). Könnte Ihnen ein paar Stunden beim Debuggen ersparen.Sie können
assign
mit einem Diktat von Spaltennamen und Werten verwenden.quelle
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
Mit der Verwendung von concat :
Ich bin mir nicht sicher, womit du machen wolltest
[np.nan, 'dogs',3]
. Vielleicht setzen Sie sie jetzt als Standardwerte?quelle
Verwendung des Listenverständnisses
pd.DataFrame
undpd.concat
quelle
Wenn ich viele fehlende Spalten (a, b, c, ....) mit demselben Wert hinzufüge, hier 0, habe ich Folgendes getan:
Es basiert auf der zweiten Variante der akzeptierten Antwort.
quelle
Ich möchte nur auf diese Option2 in der Antwort von @Matthias Fripp hinweisen
ist bereits in der eigenen Dokumentation von pandas http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics dokumentiert
quelle
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
die eine Zeile repliziert, die ihm gegeben wurde, um einen ganzen Datenrahmen mit der gleichen Länge wie der Index zu erstellen.Wenn Sie nur leere neue Spalten hinzufügen möchten, erledigt die Neuindizierung die Aufgabe
vollständiges Codebeispiel
Andernfalls gehen Sie für Null Antwort mit zuweisen
quelle
Ich bin nicht zufrieden mit "Index" und so weiter ... könnte wie folgt aussehen
quelle