Wenn Sie versuchen, einem Pandas-Datenrahmen eine Reihe hinzuzufügen, verhält sich dieser wie ein Join. Seien Sie also vorsichtig.
Bei der Verarbeitung von Daten mit Pandas werden häufig Spalten zu einem Datenrahmen hinzugefügt. Es gibt zwei Möglichkeiten, einem Tagesrahmen Spalten hinzuzufügen.
pd.DataFrame.assign
hinzu** 1. Fügen Sie eine Spalte hinzu, indem Sie den Spaltennamen angeben **
df['new_col'] = data
** 2. Spalte mit Zuweisungsmethode hinzufügen **
df.assign(new_col=data)
In beiden Fällen können Sie eine Liste mit gleichen Werten, Größen, "np.array", "pd.Series" usw. übergeben.
Bereiten Sie eine Serie mit der gleichen Anzahl von Datensätzen wie jeder Datenrahmen vor.
df = pd.DataFrame(
[[1,2,3], [4,5,6], [7,8,9]],
columns=['a', 'b', 'c'],
index=[1,2,3]
)
sr = pd.Series([-1, -2, -3])
df
# a b c
# 1 1 2 3
# 2 4 5 6
# 3 7 8 9
sr
# 0 -1
# 1 -2
# 2 -3
# dtype: int64
Wenn Sie die Daten von "sr" als neue Spalte "d" zu "df" hinzufügen möchten, gehen Sie wie folgt vor.
df = df.assign(d=sr)
Ich hoffe, dass eine solche Tabelle erstellt wird.
a | b | c | d | |
---|---|---|---|---|
1 | 1 | 2 | 3 | -1 |
2 | 4 | 5 | 6 | -2 |
3 | 7 | 8 | 9 | -3 |
In der Realität wird jedoch ein solcher Datenrahmen zurückgegeben.
a | b | c | d | |
---|---|---|---|---|
1 | 1 | 2 | 3 | -2 |
2 | 4 | 5 | 6 | -3 |
3 | 7 | 8 | 9 | NaN |
Beim erneuten Vergleich des Datenrahmens und der Serie stimmen die Indizes beider nicht überein. Mit solchen Daten können Sie sehen, dass sie sich selbst bei einer Zuweisung wie ein Join verhalten.
Dies kann vermieden werden, indem es als np.array übergeben wird.
df.assign(new_col=new_series.values)
Hinweis: Soweit das offizielle Dokument angezeigt wird, wird anstelle der Methode "values" die Methode "to_numpy" verwendet. Es wird empfohlen, dies zu tun. Es scheint so, als ob dies die in 0,24 Pandas hinzugefügte "Erweiterung Arary" klar unterscheiden soll.
Erstens wird die Methode pd.DataFrame.assign
für den zu Beginn gezeigten Prozess 1 nur dann intern aufgerufen, wenn der übergebene Wert nicht aufrufbar ist. Daher tritt bei beiden Verfahren ein Phänomen wie dieses auf.
(Übrigens entspricht "der übergebene Wert ist aufrufbar" dem Fall, dass die Spalte des Datenrahmens selbst mit einem "Lambda" -Ausdruck usw. aufgerufen wird.) [^ Callable]
Wenn Sie versuchen, etwas wie "df [" X "] = hogehoge" zuzuweisen, wird "pd.DataFrame .__ setitem__ ()" aufgerufen. Als ich dem Code folgte, fand ich die folgende Dokumentzeichenfolge. [^ setitem]
"""
Add series to DataFrame in specified column.
If series is a numpy-array (not a Series/TimeSeries), it must be the
same length as the DataFrames index or an error will be thrown.
Series/TimeSeries will be conformed to the DataFrames index to
ensure homogeneity.
"""
Mit anderen Worten sind die übergebenen Daten
Es wird angegeben, dass es so verarbeitet wird. Wenn Sie dem Code weiter folgen, können Sie sehen, dass die Daten vor dem Hinzufügen entlang des Index des Datenrahmens sortiert werden. [^ neu indizieren]
Dieses Phänomen wurde verursacht, indem man die Reihe wie ein Array betrachtete. Wie Sie unten sehen können, haben wir auch festgestellt, dass die Größe der Serie nicht einmal mit dem Datensatz in dem von uns hinzugefügten Datenrahmen übereinstimmen musste, sondern sich vollständig von der Liste oder dem Array unterschied.
df.assign(
x=pd.Series([3], index=[2])
)
# a b c x
# 1 1 2 3 NaN
# 2 4 5 6 3.0
# 3 7 8 9 NaN
Fügen Sie einem Datenrahmen wie einer Liste oder einem Array keine eindimensionalen Daten derselben Größe hinzu. Wenn Sie einer Spalte eines Datenrahmens eine Reihe zuweisen, wird der Prozess fehlerfrei fortgesetzt, auch wenn die Größe unterschiedlich ist. Daher scheint das Risiko, einen Fehler zu erstellen, ohne ihn zu bemerken, zuzunehmen. Ich habe immer gewarnt, dass ich es in ein numpy-Array konvertieren und den Zuweisungsprozess durchführen würde.
Recommended Posts