Python 熊猫-如何在没有任何';钥匙';使用另一个DF';s的价值观?

Python 熊猫-如何在没有任何';钥匙';使用另一个DF';s的价值观?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个大的矩阵,上面没有任何“键”,只有简单的数字。一个较小的版本只是为了演示这里的问题,类似于以下输入: M=pd.DataFrame(np.random.rand(4,5)) 我想要完成的是使用另一个给定的DF作为引用,它的结构如下 N=pd.DataFrame({'A':[2,2,2],'B':[2,3,4]}) N['extracted'] = M.iloc[N['A'].astype(int):,N['B'].astype(int)] …从大DF中提取值,而'A'的值对应于行号

我有一个大的矩阵,上面没有任何“键”,只有简单的数字。一个较小的版本只是为了演示这里的问题,类似于以下输入:

M=pd.DataFrame(np.random.rand(4,5))
我想要完成的是使用另一个给定的DF作为引用,它的结构如下

N=pd.DataFrame({'A':[2,2,2],'B':[2,3,4]})
N['extracted'] = M.iloc[N['A'].astype(int):,N['B'].astype(int)]
…从大DF中提取值,而'A'的值对应于号,而'B'的值对应于大DF的号,因此预期输出如下所示:

Large DF
          0         1         2         3         4
0  0.766275  0.910825  0.378541  0.775416  0.639854
1  0.505877  0.992284  0.720390  0.181921  0.501062
2  0.439243  0.416820  0.285719  0.100537  0.429576
3  0.243298  0.560427  0.162422  0.631224  0.033927

Small DF
   A  B
0  2  2
1  2  3
2  2  4

Expected Output:
   A  B extracted values 
0  2  2 0.285719
1  2  3 0.100537
2  2  4 0.429576
到目前为止,我已经尝试过类似的不同版本

N=pd.DataFrame({'A':[2,2,2],'B':[2,3,4]})
N['extracted'] = M.iloc[N['A'].astype(int):,N['B'].astype(int)]
…但它不断失败,错误是

TypeError: cannot do positional indexing on RangeIndex with these indexers
[0    2
 1    2
 2    2
哪种方法最好? 通过将DF转换为numpy阵列来完成这项工作是否更好


谢谢你的帮助

我想您应该使用apply函数。这将逐行地遍历您的数据集

N['extracted'] = N.apply(lambda row: M.iloc[row['A'], row['B']], axis=1)

我想你应该使用apply函数。这将逐行地遍历您的数据集

N['extracted'] = N.apply(lambda row: M.iloc[row['A'], row['B']], axis=1)

帮了大忙,谢谢。只是想知道,如果是一列接一列的情况,会是什么情况,例如转到“2”列并逐行应用“B”。简单的“轴=0”会失败,不是吗?是的,正确。请记住,在设置值的位置更改应用函数的两个方向。使用df['col_name']设置一列。使用.loc[row,col]可以设置以下任意一种。此函数将第一个和第二个值相加:N.loc['sum_one_and_two']=N.apply(lambda列:列[0]+列[1],轴=0)非常感谢您的帮助。只是想知道,如果是一列接一列的情况,会是什么情况,例如转到“2”列并逐行应用“B”。简单的“轴=0”会失败,不是吗?是的,正确。请记住,在设置值的位置更改应用函数的两个方向。使用df['col_name']设置一列。使用.loc[row,col]可以设置以下任意一种。此函数将第一个值和第二个值相加:N.loc['sum_one_and_two']=N.apply(lambda列:列[0]+列[1],轴=0)