这个问题是已经被问过的问题的附录:Splitting dict by value of one of the keys
我有一个包含19个键的字典,每个键包含51000个值或观察值的数组。其中一个键是分组/分类键,其值可以是1或2.我想要做的是将字典拆分为两个新词典。一个用于分类密钥为1,另一个用于分类为2时。
data = {'variable 1': array([ 90, 91, 89, ...
.
.
.
'variable 18': array([0.1, 0.02, 0.4, ...
'classifier': array([1, 1, 2, ...
}
我已经尝试过georgesl针对上述问题发布的解决方案:
data1 = [ { key : data[key][idx] for key in data.keys() } for idx, x in enumerate(data["id"]) if x == 1 ]
然而,当我运行此操作时,我收到以下错误:
IndexError: index 141 is out of bounds for axis 0 with size 1
我还尝试使用以下方法将数组转换为列表:
data2 = {}
for key in data.keys():
data[key] = data[key].tolist()
但是当我通过发布的解决方案运行它时会产生以下错误:
IndexError: list index out of range
我可能错过了一些非常明显的东西,但不能为我的生活找出什么。我愿意接受任何建议。
答案 0 :(得分:1)
from itertools import compress
data2={key:list(compress(data[key],[i-1 for i in data['classifier']])) for key in data.keys()}
data1={key:list(compress(data[key],[i-2 for i in data['classifier']])) for key in data.keys()}
这是我第一次使用itertools.compress
所以我不是专家。无论如何,它像面具一样工作,如:
>>> list(compress(['no','yes'],[False, True]))
给出:
['yes']
另外,如果
data ['classifier'] = [1, 1, 2]
然后
[i-1 for i in data['classifier']]
给出:
[0, 0, 1] #evaluates to [False,False,True]
和
[i-2 for i in data['classifier']]
给出:
[-1, -1, 0] #evaluates to [True,True,False]
现在,假设您想要分类器中的0和1,并且如果分类键为0,则您有data1,这是您的代码:
data2={key:list(compress(data[key],[i for i in data['classifier']])) for key in data.keys()} # or just data['classifier']
data1={key:list(compress(data[key],[i + anything for i in data['classifier']])) for key in data.keys()}