我正在将相当大的数据集从json解析为“传统”数据框架(行作为观察,列作为变量)。json对象包含每个观察的特征列表。我想把它转换成一个零一向量,它表示所讨论的观测是否具有这种特性。
我拥有的是“主列表”(包含所有可能的特性的列表)和观察列表(如json )。假设所有特征的个数为K,则每个观测的输出应该是长度K的0-1列表,标记每个特征是否适用于该观测。
我目前的方法是“蛮力”迭代:
characteristics #master list of all possibilities
output_dataset = []
for observation in data:
chars = observation["characteristics"]
vector = [ int(chr in chars) for chr in characteristics ]
output_dataset.append(vector)然而,这在计算上是相当昂贵的,当特征数增加到数千个,而观测到成千上万个时。
是否有更有效的方法(一般情况下,或者特别是在Python/Numpy/Pandas中)?
更新:
为了清晰,举个例子,下面是不同的变量应该是什么样子的。(想象一下,观测结果是移动设备。)
主列表:["android", "ios", "windows", "phone", "tablet", "dual-sim", "fingerprint", "nfc", "usb-c", "lg", "samsung", "huawei", "htc", "motorola", "apple", "google", "nokia"...]
一项观察:["android", "phone", "fingerprint", "nfc", "lg"...]
期望输出矢量:[1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,...]
发布于 2015-10-26 15:56:32
我不太确定我能理解,但我想你想用个白痴。dict是对任意键值执行查找的有效方法。在长度为N的列表中查找键是O(N),在dict中查找键是通过哈希表进行优化的。取决于算法和可用内存,在O(1)和O(ln,N)之间。
因此,首先将特征转换为dict,将特征映射到索引数,索引编号是它在characteristics中的位置。
chardict = {}
for i,v in enumerate(characteristics):
chardict[v] = i现在,您有了一种有效的方法,可以将特征映射到向量中正确位置的1。
vector = [0] * len(characteristics) # initialize all zero, correct length
for k in observation["characteristics"]:
if k in chardict:
vector[ chardict[k]] = 1使用dict的get方法可能更有效,通过这种方法,您还可以现在或以后检查不良的输入数据。不过不太清楚。
L = len(characteristics)
vector = [0] * (L+1) # last bin for junk input
for k in observation["characteristics"]:
vector[ chardict.get(k, L) ] = 1
if vector[L]:
# there was an input not known to characteristics ....
del vector[L] # get rid of the last element if no longer wantedhttps://stackoverflow.com/questions/33348311
复制相似问题