我有一张类似这样的表:
IDs Timestamp Values
124 300.6 1.23
124 350.1 -2.4
309 300.6 10.3
12 123.4 9.00
18 350.1 2.11
309 350.1 8.3
...
我想选择属于一组ID的所有行。我知道我可以做类似
的事情table[table.IDs == 124]
选择所有一个ID的行,我可以
table[(table.IDs == 124) | (table.IDs == 309)]
获取两个ID的行。但是想象一下,我有~100,000行,超过1,000个唯一ID(与行索引不同),我想选择与一组10个ID匹配的所有行。 直觉上我想这样做:
# id_list: a list of 10 IDs
table[ table.IDs in id_list ]
但是Python拒绝这种语法。我能想到的唯一方法就是做到以下几点:
table[ (table.IDs == id_list[0]) |
(table.IDs == id_list[1]) |
(table.IDs == id_list[2]) |
(table.IDs == id_list[3]) |
(table.IDs == id_list[4]) |
(table.IDs == id_list[5]) |
(table.IDs == id_list[6]) |
(table.IDs == id_list[7]) |
(table.IDs == id_list[8]) |
(table.IDs == id_list[9]) ]
对我来说似乎非常不优雅 - 代码太多而且不同长度的列表没有灵活性。 有没有解决我的问题的方法,例如使用列表推导或.any()函数? 任何帮助表示赞赏。
答案 0 :(得分:7)
你可以这样做:
subset = table[np.array([i in id_list for i in table.IDs])]
如果您有更新版本的numpy,可以使用in1d
功能使其更紧凑:
subset = table[np.in1d(table.IDs, id_list)]
另请参阅此问题:numpy recarray indexing based on intersection with external array
答案 1 :(得分:0)
这是一个可能比任何python for
循环更快地分析的解决方案。但是,我认为它不会比in1d
做得更好。仅当您能够承担ids.size
table.IDs.size
到ids
的临时2D整数数组时才使用它。在这里,id_list
是result = table[~np.all(table.IDs[None]-ids[None].T, 0)]
的numpy数组。
{{1}}