使用 dataframe2 中设置的条件从 dataframe1 中提取值(pandas,python)

Man*_*oon 5 python dataframe pandas

我有两个日期框(df1 和 df2),我想弄清楚如何使用 df2 中的条件从 df1 中提取值并使用 df2 中提取的值。

df1 = 精确值

df2 = 提取值的使用条件和 df

状况: df2.HJ = df1HJ & df2.JK = df1 P colum

例子 if df2(df2.HJ = 99 & df2.JK = P3); Ans = 67 (from df1)

df1

??????????????????????????????????????????
? 何洁?P1 ? P2 ? P3 ? P4 ? P5 ?
??????????????????????????????????????????
? 5 ? 51 ? 33 ? 21 ? 31 ? 13 ?
? 11 ? 66 ? 45 ? 21 ? 49 ? 58 ?
? 21 ? 7 ? 55 ? 56 ? 67 ? 73 ?
? 99 ? 0 ? 76 ? 67 ? 98 ? 29 ?
? 15 ? 11 ? 42 ? 79 ? 27 ? 54 ?
??????????????????????????????????????????

df2

????????????
? 何洁?JK ?
????????????
? 99 ? P1 ?
? 11 ? P5 ?
? 5 ? P3 ?
? 21 ? P2 ?
? 11 ? P3 ?
????????????

从 df1 提取后 df2 的预期结果

?????????????????????
? 何洁?JK ? 答案?
?????????????????????
? 99 ? P1 ? 0 ?
? 11 ? P5 ? 58 ?
? 5 ? P3 ? 21 ?
? 21 ? P2 ? 55 ?
? 11 ? P3 ? 21 ?
?????????????????????

df1 的代码

import pandas as pd
import numpy as np
data = {'HJ':[5,11,21,99,15],
'P1':[51,66,7,0,11]
,'P2':[ 33,45,55 ,76 ,42]
,'P3':[ 21 ,21 ,56 ,67 ,79]
,'P4':[ 31 ,49 ,67 ,98 ,27]
,'P5':[ 13 ,58 ,73 ,29 ,54]}
df1 = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

df2 的代码

data = {'HJ':[99,11,5,21,11],
'JK':['P1','P5','P3','P2','P3']}
df2 = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

问候 谢谢

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

更新

@Scott Boston 的解决方案有效:

df2['ans'] = df1.set_index('HJ').lookup(df2['HJ'], df2['JK']) 
Run Code Online (Sandbox Code Playgroud)

但是,当没有找到标签时,会出现 KeyError: 'One or more row labels not found'。有没有办法克服这个问题?

Sco*_*ton 7

pd.DataFrame.lookup之后使用set_index

df2['ans'] = df1.set_index('HJ').lookup(df2['HJ'], df2['JK'])
print(df2)
Run Code Online (Sandbox Code Playgroud)

输出:

   HJ  JK  ans
0  99  P1    0
1  11  P5   58
2   5  P3   21
3  21  P2   55
4  11  P3   21
Run Code Online (Sandbox Code Playgroud)

使用查找,您必须先过滤输入以查找:

df2m = df2[df2['HJ'].isin(df1['HJ']) & df2['JK'].isin(df1.columns)].copy()

df2m['ans'] = df1.set_index('HJ').lookup(df2m['HJ'],df2m['JK'])

df2.update(df2m)

df2m.combine_first(df2)
Run Code Online (Sandbox Code Playgroud)