我有一组索引:
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']
在处理数据集上的索引循环时,我遇到了一点麻烦。我的想法是循环遍历索引集合,时间与数据集中列表的数量相同。但我不认为这是最有效的方法,任何帮助都将不胜感激!
发布于 2018-12-11 04:05:07
我会这样做:
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']
这是你要找的东西吗?
发布于 2018-12-11 04:21:51
这里有一个没有循环的解决方案
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:]
https://stackoverflow.com/questions/53712520
复制相似问题