17

对于我正在编写的一些 Python 代码,我想在 R 中使用与子集命令等效的命令。

这是我的数据:

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

我想根据 和 的内容对数据进行子集col1col2。(col1 中的唯一值是 100002 和 10002,col2 中的唯一值是 2006、2007 和 2008。)

这可以在 R 中使用子集命令来完成,在 Python 中是否有类似的东西?

4

3 回答 3

21

虽然基于迭代器的答案非常好,但如果您正在使用 numpy 数组(正如您提到的那样),则有更好更快的选择事物的方法:

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]

这产生

子集1:

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

子集2:

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

(我将子集存储为字典,键是组合的元组......当然还有其他(更好,取决于你在做什么)方法来做到这一点!)

于 2010-09-27T19:18:53.737 回答
5

subset()R 中的内容与 Python 中的内容非常相似filter()。作为参考说明,这将被列表推导隐式使用,因此编写代码的最简洁明了的方法可能是

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

例如,如果您的数据行位于名为items.

于 2010-09-27T19:05:20.237 回答
2

由于我不熟悉 R 也不熟悉这个子集命令如何根据您的描述工作,我建议您看看 itertool 的 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)

然后你就有了你的子集。但是,请务必小心,因为返回的值不是完整的列表。它们是迭代器。

我假设您的值是逐行返回的。

于 2010-09-27T19:03:59.790 回答