%函数中R的%的python版本

时间:2013-06-20 20:39:51

标签: python numpy pandas

我有一个“因子”的一维整数数组,这意味着不同的东西。有时候多个数字意味着同样的事情:

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

this question...类似,但我想要元素数组而不是单个布尔值作为我的结果。

在python中执行此操作的最佳方法是什么? (numpy?pandas?)

1 个答案:

答案 0 :(得分:2)

您可以使用字典理解(以及系列isin方法)来创建它:

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