données en Python sous-ensembles de
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?
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.