R语言中 %in% 函数的Python版本

3

我有一个1D整数数组,其中的“因子”表示不同的含义。有时多个数字表示相同的含义:

import numpy as np

vec  = np.arange(1, 10)
comps = {
  'good': (3,),
  'bad': (4, 5, 9,),
  'ok': (2, 3,)
}

result = {}
for name in comps.keys():
    result[name] = np.zeros(len(vec), 'bool')
    for i, v in enumerate(vec):
        result[name][i] = v in comps[name]

这是期望的输出。但是,当 vec 变得很大并且 comps 中的键数增加时,这会变得相当缓慢。此外,它不太好看... 在 R 中有 %in% 函数:

vec = 1:10
comp = list(
    good = 3,
    bad = c(4:5, 9),
    ok = 2:3
)

lapply(comp, function(x) vec %in% x)

该函数会对左侧向量中的每个值与右侧向量中的每个值进行逐元素比较,并将“逻辑或”结果作为布尔向量返回,其长度与vec相同。

使用pandas可以更加精确和简洁:

import pandas as pd

DF = pd.DataFrame({'vec': vec})

result = {}
for name in comps.keys():
    result[name] = DF.vec.apply(lambda x: x in comps[name])

此问题类似,但我想要的是逐元素数组而不是单个布尔值作为我的结果。
在Python中,最好的方法是什么?(numpy?pandas?)

3是故意好的和可以的吗? - Andy Hayden
@AndyHayden 当然是的! - Justin
1个回答

2

您可以使用字典推导式(以及Series isin方法)来创建这个:

pd.DataFrame({k: df.vec.isin(v) for k, v in comps.iteritems()})

我知道有些东西,只是找不到它!顺便说一下,在我的特定数据集上,“isin”方法比使用“apply”快大约10倍。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接