2016-06-30 16 views
2

Ich arbeite mit einem sehr großen Datensatz (ca. 75 Millionen Einträge) und versuche die Laufzeit meines Codes deutlich zu verkürzen (mit einer Schleife wird es jetzt ein paar Tage dauern) und die Speichernutzung extrem niedrig halten.Alle Indizes jedes einzelnen Elements in einer Liste python

Ich habe zwei numpy Arrays (clients und units) der gleichen Länge. Mein Ziel ist es, eine Liste von jedem Index zu erhalten, dass ein Wert in meiner ersten Liste auftritt (clients) und dann eine Summe der Einträge in meiner zweiten Liste bei jedem dieser Indizes zu finden.

Dies ist, was ich habe versucht (np ist die zuvor importierte numpy Bibliothek)

# create a list of each value that appears in clients 
unq = np.unique(clients) 
arr = np.zeros(len(unq)) 
tmp = np.arange(len(clients)) 
# for each unique value i in clients 
for i in range(len(unq)) : 
    #create a list inds of all the indices that i occurs in clients 
    inds = tmp[clients==unq[i]] 
    # add the sum of all the elements in units at the indices inds to a list 
    arr[i] = sum(units[inds]) 

Kennt jemand eine Methode, die mir erlauben, diese Summen zu finden, ohne in unq durch jedes Element Looping?

+0

Würden Pandas eine Option für Sie sein? – Cleb

+1

Pandas sind immer eine Option. – m02ph3u5

+0

Ich benutze Pandas, um die Arrays hochzuladen und herunterzuladen, gibt es eine andere Möglichkeit, sie zu benutzen? – Lynnsey

Antwort

1

Mit Pandas, kann dies leicht die grouby() Funktion erfolgen:

import pandas as pd 

# some fake data 
df = pd.DataFrame({'clients': ['a', 'b', 'a', 'a'], 'units': [1, 1, 1, 1]}) 

print df.groupby(['clients'], sort=False).sum() 

dem Sie die gewünschte Ausgabe gibt:

  units 
clients  
a   3 
b   1 

ich die sort=False Option verwenden, da dies zu einer Geschwindigkeit führen könnte -up (Standardmäßig werden die Einträge sortiert, was bei großen Datensätzen einige Zeit dauern kann).

+1

Vielen Dank! Das ist toll! – Lynnsey

+0

@ downvoter: Könnten Sie bitte Ihren Downvote erklären? Liegt es daran, dass es eine nüchterne und keine Pandabärenfrage ist? Dann könntest du die Kommentare unter der Frage überprüfen, wo ich gefragt habe, ob Pandas eine Option sein könnten ... Wenn irgendetwas anderes falsch ist, bitte zeig es! – Cleb

1

Dies ist eine typische Gruppe-by-Typ-Operation, die elegant und effizient das numpy-indexed Paket mit durchgeführt werden kann (Disclaimer: Ich bin seinen Autor):

import numpy_indexed as npi 
unique_clients, units_per_client = npi.group_by(clients).sum(units) 

Beachten Sie, dass im Gegensatz zu dem Pandas Ansatz gibt es keine Notwendigkeit, eine temporäre Datenstruktur zu erstellen, nur um diese elementare Operation durchzuführen.

+0

Interessant. Habe noch nie von diesem Paket gehört. Irgendwelche Ideen, wie es zu der Pandas-Lösung skaliert, die ich oben hinzugefügt habe? Anscheinend mag jemand es nicht wirklich, aber bevorzugt deine Lösung, also frage ich mich, ob deine in der Tat viel effizienter ist ... :) – Cleb

+0

Ich könnte mir vorstellen, dass sie in Bezug auf die Leistung ähnlich sind. Pandas ist jedoch konzeptionell gesehen eine starke Abhängigkeit für eine solche elementare Operation. Als jemand, der die Pandas-Lösung liest, frage ich mich vielleicht, was ein Datenrahmen ist und was er mit der Gruppierung zu tun hat; und die Antwort ist im Wesentlichen "nichts". –

Verwandte Themen