Подмножество данных в Python - PullRequest
17 голосов
/ 27 сентября 2010

Я хочу использовать эквивалент команды подмножества в R для некоторого кода Python, который я пишу.

Вот мои данные:

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

Я хочу разместить данные на основена содержание col1 и col2.(Уникальные значения в столбце col1 - 100002 и 10002, а в столбце col2 - 2006,2007 и 2008 г.)

Это можно сделать в R с помощью команды subset, есть ли что-нибудь подобное в Python?

Ответы [ 3 ]

20 голосов
/ 27 сентября 2010

Хотя ответы на основе итераторов вполне хороши, если вы работаете с пустыми массивами (как вы уже упоминали), существуют более быстрые и быстрые способы выбора:

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]

Это дает

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

Если вы заранее не знали уникальных значений в первом столбце, вы можете использовать numpy.unique1d или встроенную функцию set, чтобы найти их.

Редактировать: я только что понял, что вы хотите выбрать данные, в которых у вас есть уникальные комбинации двух столбцов ... В этом случае вы можете сделать что-то вроде этого:

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

(я сохраняю подмножества как диктовку, причем ключ является кортежем комбинации ... Конечно, есть и другие (и лучше, в зависимости от того, что вы делаете) способы сделать это!)

5 голосов
/ 27 сентября 2010

subset() в R в значительной степени аналогичен filter() в Python. Как отмечается в справочном материале, это будет использоваться неявно в списках, поэтому наиболее кратким и понятным способом написания кода может быть

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

если, например, ваши строки данных были в итерируемой под названием items.

2 голосов
/ 27 сентября 2010

Поскольку я не знаком ни с R, ни с тем, как эта команда подмножества работает на основе вашего описания, я могу предложить вам взглянуть на функциональность itbytool groupby.Если дана функция, которая выводит значение, вы можете формировать группы на основе вывода этой функции.Взято из 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)

и вы получите свои подмножества.Однако будьте осторожны, так как возвращаемые значения не являются полноценными списками.Они итераторы.

Я предполагаю, что ваши значения возвращаются построчно.

...