Ich habe einen Datenrahmen mit einigen Spalten wie dieser:
A B C
0
4
5
6
7
7
6
5
Der mögliche Wertebereich in A liegt nur zwischen 0 und 7 .
Außerdem habe ich eine Liste von 8 Elementen wie folgt:
List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list
Wenn das Element in Spalte A n ist , muss ich das n- te Element aus der Liste in eine neue Spalte einfügen , z. B. 'D'.
Wie kann ich dies auf einmal tun, ohne den gesamten Datenrahmen zu durchlaufen?
Der resultierende Datenrahmen würde folgendermaßen aussehen:
A B C D
0 2
4 12
5 16
6 26
7 32
7 32
6 26
5 16
Hinweis: Der Datenrahmen ist sehr groß und die Iteration ist die letzte Option. Ich kann die Elemente in 'List' aber auch in einer anderen Datenstruktur wie diktieren, falls erforderlich.
Antworten:
IIUC, wenn Sie Ihr (leider benanntes)
List
zu einem machenndarray
, können Sie es einfach auf natürliche Weise indizieren.Hier habe ich eine neue gebaut
m
, aber wenn Sie verwendenm = np.asarray(List)
, sollte das gleiche funktionieren: Die Werte indf.A
werden die entsprechenden Elemente von auswählenm
.Beachten Sie, dass Sie bei Verwendung einer alten Version von
numpy
möglicherweisem[df.A.values]
stattdessen verwenden müssen - in der Vergangenheitnumpy
haben Sie nicht gut mit anderen gespielt, und einige Umgestaltungenpandas
verursachten Kopfschmerzen. Die Dinge haben sich jetzt verbessert.quelle
Traceback (most recent call last):
File "./b.py", line 24, in <module>
d["D"] = m[d.A]
IndexError: unsupported iterator index
numpy
Fehler. Funktioniertd["D"] = m[d.A.values]
für Sie?Ordnen Sie die Liste einfach direkt zu:
Alternative
Konvertieren Sie die Liste in eine Reihe oder ein Array und weisen Sie dann zu:
oder
quelle
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
pd.Series
den dtype verwenden? Ich meine, wird es Floats als Floats und Strings als Strings lassen? Oder werden die Elemente in der Liste standardmäßig Zeichenfolgen verwenden?Eine Lösung, die die großartige von @sparrow verbessert.
Lassen Sie df Ihr Dataset sein und führen Sie die Liste mit den Werten auf, die Sie dem Datenrahmen hinzufügen möchten.
Angenommen, Sie möchten Ihre neue Spalte einfach new_column aufrufen
Machen Sie zuerst die Liste in eine Serie:
Verwenden Sie dann die Einfügefunktion , um die Spalte hinzuzufügen. Mit dieser Funktion können Sie auswählen, an welcher Position Sie die Spalte platzieren möchten. Im folgenden Beispiel positionieren wir die neue Spalte an der ersten Position von links (durch Setzen von loc = 0).
quelle
Lassen Sie uns zuerst den Datenrahmen erstellen, den Sie hatten. Ich werde die Spalten B und C ignorieren, da sie nicht relevant sind.
Und das Mapping, das Sie wünschen:
Getan!
Ausgabe:
quelle
D
aus den Elementen vonA
undList
("Wenn das Element in Spalte A n ist, muss ich das n-te Element aus der Liste in eine neue Spalte einfügen, z. B. 'D'.")np.array(List)[df.A]
unddf["A"].map(dict(enumerate(List)))
meistens eine Frage der Präferenz.Alte Frage; aber ich versuche immer, den schnellsten Code zu verwenden!
Ich hatte eine riesige Liste mit 69 Millionen uint64. np.array () war für mich am schnellsten.
quelle