use*_*827 17 python arrays numpy r subset
对于我正在编写的一些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
Run Code Online (Sandbox Code Playgroud)
我想子集基于内容的数据col1
和col2
.(col1中的唯一值为100002和10002,col2中的唯一值为2006,2007和2008.)
这可以使用subset命令在R中完成,Python中有类似的东西吗?
Joe*_*ton 20
虽然基于迭代器的答案非常好,但是如果你正在使用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]
Run Code Online (Sandbox Code Playgroud)
这产生了
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]])
Run Code Online (Sandbox Code Playgroud)
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]])
Run Code Online (Sandbox Code Playgroud)
如果您事先不知道第一列中的唯一值,则可以使用其中一个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
Run Code Online (Sandbox Code Playgroud)
(我将子集存储为dict,其中键是组合的元组......当然还有其他(更好的,取决于你正在做的)方法!)
subset()
在R中与filter()
Python 非常类似.作为参考说明,这将由列表推导隐式使用,因此编写代码的最简洁明了的方法可能是
[ item for item in items if item.col2 == 2006 ]
Run Code Online (Sandbox Code Playgroud)
例如,如果您的数据行在一个被调用的迭代中items
.
归档时间: |
|
查看次数: |
37957 次 |
最近记录: |