我有两个由两组元组组成的numpy数组:
a = [(1, "alpha"), (2, 3), ...]
b = [(1, "zylo"), (1, "xen"), (2, "potato", ...]
元组中的第一个元素是标识符并在两个数组之间共享,因此我想创建一个新的 numpy 数组,如下所示:
[(1, "alpha", "zylo", "xen"), (2, 3, "potato"), etc...]
我目前的解决方案有效,但对我来说效率太低了。看起来像这样:
aggregate_collection = []
for tuple_set in a:
for tuple_set2 in b:
if tuple_set[0] == tuple_set2[0] and other_condition:
temp_tup = (tuple_set[0], other tuple values)
aggregate_collection.append(temp_tup)
我怎样才能有效地做到这一点?
我会将它们连接成一个数据框,然后groupby
+agg
(pd.concat([pd.DataFrame(a), pd.DataFrame(b)])
.groupby(0)
.agg(lambda s: [s.name, *s])[1])
其中0
和1
是通过pd.DataFrame
创建数据帧时给出的默认列名。将其更改为列名称。
In [278]: a = [(1, "alpha"), (2, 3)]
...: b = [(1, "zylo"), (1, "xen"), (2, "potato")]
In [279]: a
Out[279]: [(1, 'alpha'), (2, 3)]
In [280]: b
Out[280]: [(1, 'zylo'), (1, 'xen'), (2, 'potato')]
请注意,如果我尝试从a
制作数组,我会得到完全不同的东西。
In [281]: np.array(a)
Out[281]:
array([['1', 'alpha'],
['2', '3']], dtype='<U21')
In [282]: _.shape
Out[282]: (2, 2)
defaultdict
是用于收集类似键值的便捷工具
In [283]: from collections import defaultdict
In [284]: dd = defaultdict(list)
In [285]: for tup in a+b:
...: k,v = tup
...: dd[k].append(v)
...:
In [286]: dd
Out[286]: defaultdict(list, {1: ['alpha', 'zylo', 'xen'], 2: [3, 'potato']})
可以转换为元组列表,具有:
In [288]: [(k,*v) for k,v in dd.items()]
Out[288]: [(1, 'alpha', 'zylo', 'xen'), (2, 3, 'potato')]
我正在使用a+b
来加入列表,因为元组出现的位置显然无关紧要。
Out[288]
甚至不适合numpy
,因为元组的大小不同,并且项目(第一个除外)可能是字符串或数字。