Wenn Sie einen Pandas DataFrame wie diesen haben:
import pandas as pd
import numpy as np
df = pd.DataFrame({'today': [['a', 'b', 'c'], ['a', 'b'], ['b']],
'yesterday': [['a', 'b'], ['a'], ['a']]})
today yesterday
0 ['a', 'b', 'c'] ['a', 'b']
1 ['a', 'b'] ['a']
2 ['b'] ['a']
... etc
Aber mit ungefähr 100 000 Einträgen suche ich nach zeilenweisen Hinzufügungen und Entfernungen dieser Listen in den beiden Spalten.
Es ist vergleichbar mit dieser Frage: Pandas: Wie vergleiche ich Spalten von Listen zeilenweise in einem DataFrame mit Pandas (nicht für Schleife)? aber ich betrachte die Unterschiede, und die Pandas.apply
Methode scheint für so viele Einträge nicht so schnell zu sein. Dies ist der Code, den ich derzeit verwende. Pandas.apply
mit numpy's setdiff1d
Methode:
additions = df.apply(lambda row: np.setdiff1d(row.today, row.yesterday), axis=1)
removals = df.apply(lambda row: np.setdiff1d(row.yesterday, row.today), axis=1)
Dies funktioniert einwandfrei, dauert jedoch ungefähr eine Minute für 120 000 Einträge. Gibt es einen schnelleren Weg, dies zu erreichen?
Antworten:
Ich bin mir nicht sicher über die Leistung, aber mangels einer besseren Lösung könnte dies zutreffen:
Umzüge:
Ergänzungen:
quelle
applymap
froh, dass es für dich geklappt hat!quelle
Ich werde Ihnen vorschlagen, zu berechnen
additions
undremovals
innerhalb derselben anzuwenden.Generieren Sie ein größeres Beispiel
Ihre Lösung
Ihre Lösung auf einmal anwenden
Verwenden von
set
Wenn Ihre Listen nicht sehr groß sind, können Sie dies vermeiden
numpy
@ r.ooks Lösung
Wenn Sie gerne Sets anstelle von Listen als Ausgabe haben, können Sie den Code von @ r.ook verwenden
@Andreas Ks Lösung
und Sie können schließlich hinzufügen
.apply(list)
, um die gleiche Ausgabe zu erhaltenquelle
Hier ist eine mit der Idee, Computerteile in vektorisierte NumPy-Tools zu verlagern. Wir werden alle Daten für jeden Header in einzelnen Arrays sammeln, alle erforderlichen Übereinstimmungen für NumPy durchführen und schließlich zu den erforderlichen Zeileneinträgen zurückkehren. Auf dem NumPy, der den schweren Hebeteil ausführt, verwenden wir Hashing basierend auf Gruppen-IDs und IDs innerhalb jeder Gruppe mit
np.searchsorted
. Wir verwenden auch Zahlen, da diese mit NumPy schneller sind. Die Implementierung würde ungefähr so aussehen -Eine weitere Optimierung ist in den zu berechnenden Schritten
t_mask
undy_mask
wo möglichnp.searchsorted
wieder verwendet werden könnten.Wir könnten auch eine einfache Array-Zuweisung als Alternative zu dem
isin
zu erhaltenden Schritt verwendent_mask
undy_mask
so -quelle