Python 给定索引矩阵和原始数据,如何快速重建新的数据帧
我有一个数据框和一个对应于该数据框的索引表。要创建新的数据帧,是否有其他方法重建新数据。索引表中的行索引实际上是行号,因此在python意义上,实际的行索引=行号-1Python 给定索引矩阵和原始数据,如何快速重建新的数据帧,python,Python,我有一个数据框和一个对应于该数据框的索引表。要创建新的数据帧,是否有其他方法重建新数据。索引表中的行索引实际上是行号,因此在python意义上,实际的行索引=行号-1 # simulate index table col_index=np.random.choice([0,1], 5, p=[0.4, 0.6]) row_index=np.random.choice([3,1,2],5, p=[0.4, 0.5,0.1]) ind=np.vstack((row_i
# simulate index table
col_index=np.random.choice([0,1], 5, p=[0.4, 0.6])
row_index=np.random.choice([3,1,2],5, p=[0.4, 0.5,0.1])
ind=np.vstack((row_index,col_index))
ind=ind.T
array([[3, 0],
[3, 1],
[2, 1],
[1, 1],
[1, 0]])
dt=np.random.random((5, 2)) #simulated data
array([[ 0.3592, 0.4983],
[ 0.0518, 0.2291],
[ 0.4322, 0.5654],
[ 0.8482, 0.1722],
[ 0.1448, 0.5766]])
# My code
newDt=np.zeros([5,1])
for j in range(5):
row=ind[j,0]
col=ind[j,1]
newDt[j]=dt[row-1,col]
#output
array([[ 0.4322],
[ 0.5654],
[ 0.2291],
[ 0.4983],
[ 0.3592]])
假设您有一些值,
vals
,以及一些索引,ind
:
>>> vals
array([[ 0.3592, 0.4983],
[ 0.0518, 0.2291],
[ 0.4322, 0.5654],
[ 0.8482, 0.1722],
[ 0.1448, 0.5766]])
>>> ind
array([[3, 0],
[3, 1],
[2, 1],
[1, 1],
[1, 0]])
获取所需内容的最简单方法是使用多维索引:
>>> vals[ind[:,0] - 1, ind[:,1]]
array([ 0.4322, 0.5654, 0.2291, 0.4983, 0.3592])
如果,正如您的问题所暗示的,您的值位于pd.DataFrame
中,那么您可以访问values
属性来处理底层np.array
:
>>> df
0 1
0 0.3592 0.4983
1 0.0518 0.2291
2 0.4322 0.5654
3 0.8482 0.1722
4 0.1448 0.5766
>>> df.values[ind[:,0] - 1, ind[:,1]]
array([ 0.4322, 0.5654, 0.2291, 0.4983, 0.3592])
.... 什么你说你想要一个数据帧,但你的输出是一个数组…。@juanpa.arrivillaga,我的意思是我需要一系列与索引表对应的值。可以将其视为查找表并记录每个值。如果“表”不止三个维度,而要作为索引的“数据”也不止三个维度,该怎么办?有没有一种方法可以在没有循环的情况下表达三维以上的数据?@alphabetagama它应该在更高的维度上使用相同的方法。我不确定我是否理解你的评论。例如,对于一个动态规划问题,您可能有不止一个状态变量,对于每个状态变量,您都有一个关联的值表,该表只是一个平面,如果您有一个三维空间或更高的空间,该怎么办dimensions@alphabetagamma什么这听起来似乎与你的问题无关。你为什么不问你实际上想回答的问题呢。请使用标准术语。您一直在使用诸如“dataframe”和“table”之类的术语,但您可能只是指“array”。我不知道,因为你一直不稳定。在任何情况下,索引到高维数组的工作原理与我在这个答案中所展示的完全相同。