Question

Je veux utiliser l'équivalent de la commande sous-ensemble de R pour un code Python Je vous écris.

Voici mes données:

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

Je veux sous-ensemble des données basées sur le contenu de col1 et col2. (Les valeurs uniques dans col1 sont 100002 et 10002, et col2 sont 2006,2007 et 2008).

Cela peut être fait en utilisant la commande R de sous-ensemble, est-il quelque chose de semblable en Python?

Était-ce utile?

La solution

Alors que les réponses fondées sur itérateur sont parfaitement bien, si vous travaillez avec des tableaux de numpy (comme vous le mentionnez que vous êtes), il existe de meilleures façons et plus rapide de sélectionner les choses:

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]

Cela donne

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]])

Si vous ne connaissez pas les valeurs uniques dans la première colonne à l'avance, vous pouvez utiliser numpy.unique1d ou set fonction builtin pour les trouver.

Edit: Je viens de réaliser que vous vouliez sélectionner des données où vous avez des combinaisons uniques de deux colonnes ... vous pourriez Dans ce cas, faire quelque chose comme ceci:

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

(je stocker les sous-ensembles comme dict, la clé étant un tuple de la combinaison ... Il y a certainement d'autres (et mieux, en fonction de ce que vous faites) façons de le faire!)

Autres conseils

subset() en R est à peu près analogue à filter() en Python. Comme les notes de référence, il sera utilisé implicitement par la liste compréhensions, donc la façon la plus concise et claire pour écrire le code peut être

[ item for item in items if item.col2 == 2006 ] 

si, par exemple, vos lignes de données étaient dans un items appelé itérables.

Depuis que je ne suis pas familier avec R, ni comment cette commande fonctionne sous-ensemble sur la base de votre description je peux vous suggère de jeter un oeil à itertool de fonctionnalité groupby. Si on leur donne une fonction qui génère une valeur, vous pouvez former des groupes basés sur la sortie de cette fonction. Tiré de 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)

et puis vous avez vos sous-ensembles. Cependant, faites attention que les valeurs renvoyées ne sont pas des listes à part entière. Ils sont itérateurs.

Je suppose que vos valeurs sont retournées sur une base ligne par ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top