根据列连接数组

时间:2017-01-16 16:19:39

标签: python arrays numpy

我在python中有一个2d数组的列表。对于每个2d数组,最后一列表示ID。现在我想根据ID(最后一列)加入(也许是numpy)数组的行。

因此,例如ID为1的行应该连接在一起。每个ID仅在每个阵列中出现一次。此外,ID(最后一列)以及倒数第二列只应写在连接数组的最末端(即只能写一次)。

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

Pandas对这个角色有一个很好的updateText方法。如果您的id列是您的join索引,那么最简单的方法就是使用它。假设您的两个数组中有两个是DataFrameadata,其对应的ID是bdataa_ids。 (如果你只处理整数数据集,并且你的id也是整数,它们可以进入numpy数组的最后一列。但是通常numpy处理浮点值,而id通常是字符串而不是整数。在那些常见的情况下,更好或甚至必须保持id分离,因为numpy数组是同质的。)

b_ids

现在你有类似的东西:

加入:

import pandas as pd

a = pd.DataFrame(adata, index=a_ids)
b = pd.DataFrame(bdata, index=b_ids)

产量:

这是一个外连接,意味着它返回所有记录的并集,包括只在一个或另一个数据集中出现id的情况。如果您只想在两个输入上匹配(或者如果所有数据集都具有等效ID),则可以使用ab = a.join(b, lsuffix='a', rsuffix='b', how='outer') 进行更紧密的交叉连接。

如果你想要一个numpy数组而不是how='inner',那很容易:

DataFrame

收率:

ab.values

对于加入的指数:

array([[-0.68185189,  2.06517757,  0.49309249,  0.56342363],
       [ 0.18518231, -2.93460494,         nan,         nan],
       [ 0.06447249, -0.30244753,  2.46605889, -0.28043202],
       [ 0.62137062,  0.10228747, -0.21668058, -1.07091799],
       [-0.37247196, -1.5782334 ,         nan,         nan],
       [-1.0523353 , -0.52960419,         nan,         nan],
       [ 0.13638979,  0.92173315,         nan,         nan]])

给出:

ab.index.values 

因此,虽然您通过Pandas跳舞并从其高级联接操作中受益(即使您的数据集具有不同的大小,但其中包含的ID也不完全相同,即使ID的顺序不同) ,如果你想与这些人合作,你就会回到NumPy值。

最后请注意,如果您使用NumPy作为整数值,那么您的ID已经嵌入到每个数据集中的最后一列,只需调整array([1001, 1002, 1003, 1004, 1005, 1006, 1007]) 构造函数以获取如下数据:

DataFrame

答案 1 :(得分:0)

以下是使用pandas的最小示例,因为最初没有提供任何数据或代码:

import numpy as np
import pandas as pd

# let the last column in these 2-d arrays be the "ID" column
arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]])
arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]])

df1 = pd.DataFrame(arr1)
df2 = pd.DataFrame(arr2)

# Again, a minimal example, but the column at index 4 in these
# DataFrames is the ID column, so we can merge on 4 to get our result
result = pd.merge(df1, df2, on = 4)

答案 2 :(得分:0)

带有 <?xml version="1.0" encoding="utf-8"?> <ApplicationPackage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="My AutoCAD App" Description="Does something in AutoCAD" Icon="./Application/MyIcon.ico" Author="Paul Nelson"> <CompanyDetails Name="Paul Nelson" Url="http://www.stackoverflow.com" Email="myemail@email.com"> </CompanyDetails> <Components> <!-- define the min and max versions of AutoCA in the next line --> <RuntimeRequirements OS="Win64" Platform="AutoCAD" SeriesMin="R19.0" SeriesMax="R22.0" /> <ComponentEntry ModuleName=".\Application\MyApp.dll" LoadOnAutoCADStartup="true" LoadOnCommandInvocation="false" AppDescription="This is assembly MyApp." AppName="My AutoCAD App" AppType=".NET"> <Commands GroupName="My Apps"> <Command Local="MYAPP" Global="MYAPP" /> </Commands> </ComponentEntry> </Components> </ApplicationPackage> 示例数据的numpy版本,使用@robot's按最后一列值收集行:

argsort
  

此外,ID(最后一列)以及倒数第二列只应写在连接数组的最末端(即只能写一次)。

如果我理解正确的话,这个要求是不可能的In [28]: arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]]) In [29]: arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]]) In [30]: arr=np.concatenate((arr1,arr2),axis=0) In [31]: arr Out[31]: array([[0, 0, 1, 1, 1], [0, 1, 0, 0, 2], [1, 1, 1, 2, 3], [1, 1, 1, 1, 1], [2, 1, 0, 0, 2], [2, 2, 1, 2, 3]]) In [32]: idx=np.argsort(arr[:,-1]) In [33]: idx Out[33]: array([0, 3, 1, 4, 2, 5], dtype=int32) In [34]: arr[idx,:] Out[34]: array([[0, 0, 1, 1, 1], [1, 1, 1, 1, 1], [0, 1, 0, 0, 2], [2, 1, 0, 0, 2], [1, 1, 1, 2, 3], [2, 2, 1, 2, 3]]) 数组每行必须有相同的列数。使用numpy,您可以构建多级索引,并且可能使用此pandas作为索引级别。

我们需要你自己的样本,输入和结果,才能做得更好。

===============

我们可以使用ID将已排序的数组拆分为具有公共最终列的数组。我手动选择np.split,但如果您感兴趣,可以从数据中获取。

[2,4]