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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top