Die ursprüngliche Frage befasst sich mit einem bestimmten engen Anwendungsfall. Für diejenigen, die allgemeinere Antworten benötigen, sind hier einige Beispiele:
Erstellen einer neuen Spalte mit Daten aus anderen Spalten
Angesichts des folgenden Datenrahmens:
import pandas as pd
import numpy as np
df = pd.DataFrame([['dog', 'hound', 5],
['cat', 'ragdoll', 1]],
columns=['animal', 'type', 'age'])
In[1]:
Out[1]:
animal type age
----------------------
0 dog hound 5
1 cat ragdoll 1
Im Folgenden fügen wir eine neue description
Spalte als Verkettung anderer Spalten hinzu, indem wir die +
Operation verwenden, die für Serien überschrieben wird. Ausgefallene String-Formatierungen, F-Strings usw. funktionieren hier nicht, da dies +
für Skalare und nicht für 'primitive' Werte gilt:
df['description'] = 'A ' + df.age.astype(str) + ' years old ' \
+ df.type + ' ' + df.animal
In [2]: df
Out[2]:
animal type age description
-------------------------------------------------
0 dog hound 5 A 5 years old hound dog
1 cat ragdoll 1 A 1 years old ragdoll cat
Wir bekommen 1 years
für die Katze (anstelle von 1 year
), die wir unten unter Verwendung von Bedingungen reparieren werden.
Ändern einer vorhandenen Spalte mit Bedingungen
Hier ersetzen wir die ursprüngliche animal
Spalte durch Werte aus anderen Spalten und verwenden np.where
, um eine bedingte Teilzeichenfolge basierend auf dem Wert von age
:
# append 's' to 'age' if it's greater than 1
df.animal = df.animal + ", " + df.type + ", " + \
df.age.astype(str) + " year" + np.where(df.age > 1, 's', '')
In [3]: df
Out[3]:
animal type age
-------------------------------------
0 dog, hound, 5 years hound 5
1 cat, ragdoll, 1 year ragdoll 1
Ändern mehrerer Spalten mit Bedingungen
Ein flexiblerer Ansatz besteht darin, .apply()
einen gesamten Datenrahmen anstelle einer einzelnen Spalte aufzurufen:
def transform_row(r):
r.animal = 'wild ' + r.type
r.type = r.animal + ' creature'
r.age = "{} year{}".format(r.age, r.age > 1 and 's' or '')
return r
df.apply(transform_row, axis=1)
In[4]:
Out[4]:
animal type age
----------------------------------------
0 wild hound dog creature 5 years
1 wild ragdoll cat creature 1 year
Im obigen Code transform_row(r)
nimmt die Funktion ein Series
Objekt, das eine bestimmte Zeile darstellt (angezeigt durch axis=1
, der Standardwert von axis=0
liefert ein Series
Objekt für jede Spalte). Dies vereinfacht die Verarbeitung, da wir mithilfe der Spaltennamen auf die tatsächlichen 'primitiven' Werte in der Zeile zugreifen können und andere Zellen in der angegebenen Zeile / Spalte sichtbar sind.
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'