繁体   English   中英

Numpy/Pandas:基于一个数组高效地合并两个 numpy 数组

[英]Numpy/Pandas: Merge two numpy arrays based on one array efficiently

我有两个像这样的 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])

其中01是通过pd.DataFrame创建数据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拟合,因为元组的大小不同,并且项目(除了第一个)可能是字符串或数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM