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)