我在python中有一个2d数组的列表。对于每个2d数组,最后一列表示ID。现在我想根据ID(最后一列)加入(也许是numpy)数组的行。
因此,例如ID为1的行应该连接在一起。每个ID仅在每个阵列中出现一次。此外,ID(最后一列)以及倒数第二列只应写在连接数组的最末端(即只能写一次)。
如何做到这一点?
答案 0 :(得分:1)
Pandas对这个角色有一个很好的updateText
方法。如果您的id列是您的join
索引,那么最简单的方法就是使用它。假设您的两个数组中有两个是DataFrame
和adata
,其对应的ID是bdata
和a_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]