Ich habe einen Datenrahmen wie folgt aus:Pandas bekommen Index der höchsten Punktprodukt
df1 = pd.DataFrame({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
a b c
0 1 5 9
1 2 6 10
2 3 7 11
3 4 8 12
Und ich möchte eine andere Spalte in diesem Datenrahmen schaffen, die für jede Zeile speichert, die andere Reihe die höchste Punktzahl erhält, wenn durchgeführt ein Punktprodukt gegen.
Zum Beispiel für die erste Zeile wir die Punktprodukte gegen die anderen Reihen berechnen werden:
df1.drop(0).dot(df1.loc[0]).idxmax()
output: 3
Deshalb ich eine Funktion erstellen:
def get_highest(dataframe):
lis = []
for row in dataframe.index:
temp = dataframe.drop(row).dot(dataframe.loc[row])
lis.append(temp.idxmax())
return lis
Und ich bekommen, was ich will mit :
Ok, das funktioniert, aber das Problem ist, dass es überhaupt nicht skaliert. Hier sind die Ausgänge von timeit
für unterschiedliche Anzahl der Zeilen:
4 rows: 2.87 ms
40 rows: 77.1 ms
400 rows: 700 ms
4000 rows: 10.4s
Und ich muss führen dies auf einem Datenrahmen, die etwa 240k Zeilen und Spalten 3.3k hat. Deshalb hier meine Frage: Gibt es eine Möglichkeit, diese Berechnung zu optimieren? (wahrscheinlich, indem Sie es auf andere Weise ansprechen)
Vielen Dank im Voraus.
ich die numpy Tag hinzugefügt, da wahrscheinlich eine numpy basierte Lösung wird schneller sein, so numpy Leute können auch einen Blick daran. – ayhan
@ayhan Gute Idee, danke – ysearka
Dies könnte hilfreich sein. http://StackOverflow.com/q/38177464/2336654 – piRSquared