Python:二进制向量

时间:2018-12-10 19:41:44

标签: python-2.7 vector

我有一组索引:

indices = (['1', '1.2', '2', '2.2', '3', '4'])

和一个数据集,其中第一个元素标识一个人,第二个元素标识一个回合,第三个元素是索引集中的索引:

dataset = [['A', '1', '1'], ['A', '1', '1.2'], ['B', '1', '2'], ['C', '2', '3']]

我想形成一个二进制向量,其中对于每个人和每个单独的回合,将索引标记为存在(带有1)或不存在(带有0)。

所需的输出将是这样的,其中对于A,向量表示存在索引1和1.2,对于B,代表索引2,对于C,代表索引3。请注意,对于A,存在只有一个记录,但存在两个索引。

['A', '1', '1, 1, 0, 0, 0, 0']
['B', '1', '0, 0, 1, 0, 0, 0']
['C', '2', '0, 0, 0, 0, 1, 0']

我在解决数据集上的索引循环时遇到了麻烦。我的想法是遍历索引集,该索引集的时间与数据集中列表的数量相同。但我认为这不是最有效的方法,任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:0)

我会这样做:

from itertools import groupby

for k, g in groupby(dataset, lambda x: x[:2]):
    vals = [x[2] for x in g]
    print(k + [", ".join("1" if x in vals else "0" for x in indices)])

输出

['A', '1', '1, 1, 0, 0, 0, 0']
['B', '1', '0, 0, 1, 0, 0, 0']
['C', '2', '0, 0, 0, 0, 1, 0']

这是您要找的吗?

答案 1 :(得分:0)

这是没有循环的解决方案

import pandas as pd
indlist=['1', '1.2', '2', '2.2', '3', '4']
dataset = [['A', '1', '1'], ['A', '1', '1.2'], ['B', '1', '2'], ['C', '2', '3']]
df=pd.DataFrame(dataset,columns=['player','round','ind']).set_index('ind').reindex(indlist)
ans=df.reset_index().pivot('player','ind','round').fillna(0)[1:]