Subsetting Daten in Python
Frage
Ich möchte für einige Python-Code das Äquivalent des Subsets Befehl in R verwenden, ich schreibe.
Hier ist meine Daten:
col1 col2 col3 col4 col5
100002 2006 1.1 0.01 6352
100002 2006 1.2 0.84 304518
100002 2006 2 1.52 148219
100002 2007 1.1 0.01 6292
10002 2006 1.1 0.01 5968
10002 2006 1.2 0.25 104318
10002 2007 1.1 0.01 6800
10002 2007 4 2.03 25446
10002 2008 1.1 0.01 6408
Ich möchte die Daten basierend auf Inhalten von col1
und col2
der Teilmenge. (Die eindeutigen Werte in col1 sind 100002 und 10002, und in col2 sind 2006,2007 und 2008).
Dies kann in R durchgeführt werden, um die Teilmenge Befehl verwendet wird, ist es etwas ähnliches in Python?
Lösung
Während die Iterator-basierten Antworten sind völlig in Ordnung, wenn Sie mit numpy Arrays arbeiten (wie Sie erwähnen, dass Sie sind) gibt es bessere und schnellere Möglichkeiten, Dinge zu Auswahl:
import numpy as np
data = np.array([
[100002, 2006, 1.1, 0.01, 6352],
[100002, 2006, 1.2, 0.84, 304518],
[100002, 2006, 2, 1.52, 148219],
[100002, 2007, 1.1, 0.01, 6292],
[10002, 2006, 1.1, 0.01, 5968],
[10002, 2006, 1.2, 0.25, 104318],
[10002, 2007, 1.1, 0.01, 6800],
[10002, 2007, 4, 2.03, 25446],
[10002, 2008, 1.1, 0.01, 6408] ])
subset1 = data[data[:,0] == 100002]
subset2 = data[data[:,0] == 10002]
Dies ergibt
subset1:
array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03],
[ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05],
[ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05],
[ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]])
subset2:
array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03],
[ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05],
[ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03],
[ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04],
[ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]])
Wenn Sie nicht die eindeutigen Werte in der ersten Spalte wussten vorher, können Sie entweder numpy.unique1d
oder die eingebaute Funktion set
sie zu finden.
Edit: Ich habe erkannt, dass Sie wollten Daten auszuwählen, wo Sie einzigartige Kombinationen aus zwei Spalten ... In diesem Fall könnten Sie so etwas tun:
col1 = data[:,0]
col2 = data[:,1]
subsets = {}
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)):
subset = data[(col1 == val1) & (col2 == val2)]
if np.any(subset):
subsets[(val1, val2)] = subset
(Ich bin die Teilmengen als dict speichern, mit dem Schlüssel ein Tupel der Kombination zu sein ... Es gibt sicherlich andere (und besser, je nachdem, was Sie taten) Möglichkeiten, dies zu tun!)
Andere Tipps
subset()
in R ist so ziemlich analog zu filter()
in Python. Da die Referenz Notizen wird bei dieser implizit durch Listenkomprehensionen verwendet werden, so dass die meisten präzise und klare Art und Weise der Code zu schreiben, könnte sein,
[ item for item in items if item.col2 == 2006 ]
Wenn zum Beispiel Ihrer Datenzeilen in einem iterable genannt items
waren.
Da ich mit R nicht vertraut bin, noch wie diese Teilmenge Befehl auf Ihrer Beschreibung basiert funktioniert kann ich vorschlagen, dass Sie einen Blick auf itertool der groupby Funktionalität. Wenn eine Funktion gegeben, die einen Wert ausgibt, können Sie Gruppen auf diese Funktion der Ausgabe auf Basis bilden. Genommen von groupby :
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
groups.append(list(g)) # Store group iterator as a list
uniquekeys.append(k)
und dann haben Sie Ihre Untergruppen bekommen. Jedoch seien Sie vorsichtig, da die zurückgegebenen Werte sind nicht vollwertiges Listen. Sie sind Iteratoren.
Ich gehe davon aus, dass Ihre Werte auf einer Zeile-für-Zeile-Basis zurückgegeben werden.