Pergunta

Quero usar o equivalente ao comando de subconjunto em R para algum código Python que estou escrevendo.

Aqui estão meus dados:

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

Eu quero subconjuntar os dados com base no conteúdo de col1 e col2. (Os valores únicos em Col1 são 100002 e 10002 e em Col2 são 2006.2007 e 2008.)

Isso pode ser feito em r usando o comando de subconjunto, há algo semelhante no Python?

Foi útil?

Solução

Embora as respostas baseadas em iterador sejam perfeitamente boas, se você estiver trabalhando com matrizes Numpy (como você menciona que está), existem maneiras melhores e mais rápidas de selecionar coisas:

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]

Isso rende

subconjunto1:

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

subconjunto2:

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

Se você não sabia os valores únicos na primeira coluna de antemão, você pode usar também numpy.unique1d ou a função construída set para encontrá -los.

EDIT: Acabei de perceber que você queria selecionar dados onde você tenha combinações exclusivas de duas colunas ... nesse caso, você pode fazer algo assim:

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

(Estou armazenando os subconjuntos como um ditado, com a chave sendo uma tupla da combinação ... certamente existem outras maneiras (e melhor, dependendo do que você está fazendo) maneiras de fazer isso!)

Outras dicas

subset() em r é praticamente análogo a filter() em Python. Como observa as observa

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

Se, por exemplo, suas linhas de dados estivessem em um iterável chamado items.

Como não estou familiarizado com o R nem como esse comando de subconjunto funciona com base na sua descrição, posso sugerir que você dê uma olhada na funcionalidade do grupo do ITERTOOL. Se tiver uma função que produza um valor, você pode formar grupos com base na saída dessa função. Tirado de grupo:

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)

E então você tem seus subconjuntos. No entanto, tenha cuidado, pois os valores retornados não são listas completas. Eles são iteradores.

Estou assumindo que seus valores estão sendo devolvidos em uma base em fila por fila.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top