Wie berechnen die gewichtete Summe aller Elemente in einer Zeile in pandas?
Habe ich ein Pandabären-Daten-frame mit mehreren Spalten. Ich will eine neue Spalte erstellen weighted_sum
von den Werten in der Zeile und eine weitere Spalte vector-dataframe weight
weighted_sum
sollte den folgenden Wert haben:
row[weighted_sum] = row[col0]*weight[0] + row[col1]*weight[1] + row[col2]*weight[2] + ...
Fand ich die Funktion sum(axis=1)
, aber es lässt mich nicht multiplizieren mit weight
.
Bearbeiten:
Ich änderte die Dinge ein wenig.
weight
sieht wie folgt aus:
0
col1 0.5
col2 0.3
col3 0.2
df
sieht wie folgt aus:
col1 col2 col3
1.0 2.2 3.5
6.1 0.4 1.2
df*weight
gibt einen dataframe voller Nan
Werte.
- Können Sie zeigen einige Ihrer
DataFrame
undweights
? Es ist nicht klar, warum Sie ein problem, dies zu tun. Wenn Sie wollen einfach nur das Skalarprodukt der Zeile Werte mitweights
dann verwenden Sie diendarray.dot
Methode:row.values.dot(weights.values)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass man die Multiplikation a-frame mit einem frame von einer anderen Größe, mit einer anderen Zeile, index. Hier ist die Lösung:
Können Sie entweder auf die Spalte:
Oder verwenden Sie
dot
um wieder anderenDataFrame
Bringen Sie alle zusammen:
Hier sind die
timeit
s, jede Methode, die Verwendung einer größerenDataFrame
.Für eine Breite
DataFrame
:So,
dot
ist schneller und besser lesbar.HINWEIS:, Wenn alle Ihre Daten enthalten
NaN
s, dann sollten Sie nicht verwendendot
sollten Sie die multiply-and-sum-Methode.dot
nicht in den GriffNaN
s, da es nur ein dünner wrapper umnumpy.dot()
(was nicht handhabenNaN
s).df.mul(weight).sum(1)
scheint über die gleichen (wenn auch ein wenig langsamer).df.dot(weight)
produzieren eineDataFrame
wenndf
undweight
sind beideDataFrames
eineSeries
wenn entweder einSeries
und eine Skalare sind beideSeries
. Numerisch sind Sie gleichwertig.*
Betrieb.dot
braucht keine solche temporäre 🙂dot
tut, wasnumpy
mitNaN
s: barfs Sie gleich wieder in Sie.(df * weight).sum(1).head() != df.dot(weight).head()
?weight
s verwenden Sie?Series
oderDataFrame
?weight
ist einDataFrame
dann Ihre obige code korrekt ist. Wennweight
ist einSeries
dann ist es falsch. Dieweight
die OP vorgesehen ist, eineDataFrame
das ist der Grund, warum er immer alleNaN
s.NaN
s, die ich bemerkt :sNaN
s indot
in bestimmten Fällen, wie z.B. der Kovarianz-Matrizen nicht positiv semi-definit ist, wenn man Sie ignorieren. Ich denke, dass R lief auch in dieser Frage an einem gewissen Punkt, aber ich kann mich nicht erinnern, was Sie Taten. Vielleicht war es so etwas wie "lassen Sie den Benutzer entscheiden, ob Sie zulassen möchten, nichtNaN
Werte in die Berechnung ein." Ich erstelle ein Thema, da ich denke, dass sollten wir lassen die user entscheiden, und halten Sie das aktuelle Verhalten als Standard.Vorausgesetzt GEWICHTE ist eine Reihe von gewichten für die einzelnen Spalten können Sie einfach multiplizieren und tun der Summe:
Der Vorteil dieses Ansatzes ist es kümmert sich um Spalten, die Sie nicht wollen, zu Wiegen: