[PYTHON] Seien Sie vorsichtig, wenn Sie pandas.DataFrame Series als Spalte zuweisen

Wenn Sie versuchen, einem Pandas-Datenrahmen eine Reihe hinzuzufügen, verhält sich dieser wie ein Join. Seien Sie also vorsichtig.

Vor

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.

  1. Fügen Sie eine Spalte hinzu, indem Sie den Spaltennamen angeben
  2. Fügen Sie mit der Methode 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.

Intuitives Verhalten beim Ersetzen einer Serie

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

Was ist los

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.

Problemumgehung

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.

Warum passiert das?

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

Zusammenfassung

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

Seien Sie vorsichtig, wenn Sie pandas.DataFrame Series als Spalte zuweisen
Seien Sie vorsichtig, wenn Sie einem Array ein Array hinzufügen
Python Hinweis: Wenn Sie einer Zeichenfolge einen Wert zuweisen
Seien Sie vorsichtig, wenn Sie die Eigenvektoren einer Matrix unterscheiden
Was tun, wenn nicht ausrichtbare boolesche Reihen als Indexer bereitgestellt werden?
Seien Sie vorsichtig, wenn Sie den Standardargumentwert in der Python 3-Serie angeben
Was tun, wenn ein Video von cv2.VideoCapture nicht gelesen werden kann?
Wie man Jupytext gut einstellt, wenn man Code als Team verwaltet
[Python] Seien Sie vorsichtig, wenn Sie Druck verwenden
Dinge, die beim Erstellen eines Empfehlungssystems mit Item2Vec zu beachten sind
Wenn Sie eine Spalte spaltenweise durch einen fehlenden Wert (NaN) ersetzen möchten
[Python-Memo] Seien Sie vorsichtig, wenn Sie ein zweidimensionales Array erstellen (Liste der Listen).
Selbst wenn Sie in pandas.DataFrame nur eine bestimmte Spalte zuweisen und einen Index anhängen, müssen Sie sich nicht um die Reihenfolge der Daten kümmern
Seien Sie vorsichtig, wenn Sie CakePHP3 mit PHP7.2 ausführen
[Linux] [Kernelmodul] Übergeben von Parametern als Argumente beim Laden eines ladbaren Kernelmoduls
Verwalten von Argumenten beim Implementieren eines Python-Skripts als Befehlszeilentool