(使用Python 2.7)
注意:这是与Concatenating dictionaries of numpy arrays of different lengths (avoiding manual loops if possible)非常相似的问题。但是,我的用例略有不同:
总结问题:
我有一个numpy字典数组在结构上完全相同(意味着它们都有相同的键)包含可变长度的numpy数组(包括空)。嵌套数据结构FTW!
我想要的是一个“合并”字典,其中对于每个键,所有numpy数组都连接在一起。
例如:
source = [{"a":numpy.array([1,2,3]),"b":numpy.array(['a','b','c'])},{"a":numpy.array([4,5]),"b":numpy.array(['d','e','f','g','h'])}]
# Perform magic here into result
result = {"a":numpy.array([1,2,3,4,5]),"b":numpy.array(['a','b','c','d','e','f','g','h'])}
我可以遍历每个字典并使用numpy.append()
,但我认为因为这是Python和Numpy,应该有一个更优雅的解决方案使用某种切片?
与上述相似问题的区别:
似乎在链接的问题中只有几个词典,并且键在语义上是链接的。例如,在数据集0中,键“a”为1,键“b”为“a”,键“c”为NaN,依此类推。但在我的情况下,“之间没有连接”事实上,大多数熊猫表都是由带有NaN的数据集组成的。连接的“a”可能有一万个条目,而连接的“b”在极端情况下可能是空的。此外,我可能有数百个词典,我想“连接”。最后,链接的问题有一个字典中存在的键,而另一个字典中没有。这在我的情况下是不可能的。
我想知道,鉴于这些情况,如果熊猫数据帧方法仍然是最好的方法,考虑到我需要为每个字典创建一个数据帧,最终结果将是一个具有大量NaN的数据帧
谢谢!
答案 0 :(得分:1)
如果可以将NumPy数组转换为Python列表,那么您可以使用collections.Counter
:
In [15]: from collections import Counter
In [16]: source_ = [{"a":[1,2,3],"b":['a','b','c']},
{"a": [4,5], "b":['d','e','f','g','h']}]
In [17]: sum((Counter(x) for x in source_), Counter())
Out[17]: Counter({'b': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
'a': [1, 2, 3, 4, 5]})
答案 1 :(得分:1)
我会遍历键而不是迭代字典。这将允许您使用numpy.concatenate
,这比numpy.append
更适合此情况,我认为它更容易阅读。如果有一个内置的numpy,我会感到惊讶,即使有,我认为它不会对可读性或性能做太多。
source = [{"a":numpy.array([1,2,3]),"b":numpy.array(['a','b','c'])},
{"a":numpy.array([4,5]),"b":numpy.array(['d','e','f','g','h'])}]
result = {}
for key in source[0]:
result[key] = numpy.concatenate([d[key] for d in source])