numpy Pandas Vlookup True

k5ifujac  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(107)

我正试图将Excel中的一个模型转换为Python,以便将来进行验证。
我的python经验是大约6个月时,需要工作的目的,并相信我已经使问题更加复杂,然后它需要,由于尝试不同的途径。
我基本上是在复制下面的内容:

=vlookup('Sheet1'!B2, 'Sheet2'!A1:D100, if('Sheet1'!C2='A',2, if('Sheet1'!C2='B',3,4), TRUE))

字符串
因此表1是客户端和距离的列表。
python mock数据:

df1 = pd.DataFrame({'Client': ['ABC', 'XYZ', 'KLM'],'Distance': [0.137, 0.103, 0.205], 'Type':['A','B','C']})

  Client  Distance Type
0    ABC     0.137    A
1    XYZ     0.103    B
2    KLM     0.205    C
df2 = pd.DataFrame({'Distance': [0.05, 0.1, 0.15, 0.20, 0.25],'A': [1,2,3,4,5], 'B':[0.5,1,1.5,2,2.5], 'C': [2,2.2,2.4,2.6,2.8]})

   Distance  A    B    C
0      0.05  1  0.5  2.0
1      0.10  2  1.0  2.2
2      0.15  3  1.5  2.4
3      0.20  4  2.0  2.6
4      0.25  5  2.5  2.8

的数据
预期的输出:

df1 = pd.DataFrame({'Client': ['ABC', 'XYZ', 'KLM'],'Distance': [0.137, 0.154, 0.205], 'Type':['A','B','C'], 'Df2val':[3,1, 2.6 ]})

  Client  Distance Type  Df2val
0    ABC     0.137    A     3.0
1    XYZ     0.154    B     1.0
2    KLM     0.205    C     2.6


最初的数据是~ 25 k行,我已经将其减少到~500行,删除了距离参数之外的行以减少计算。
我有一个参考点列表,所以df ['Distance']将在网格覆盖中重新计算441次。
但是我希望在循环/λ运行通过这些参考点时将该Vlookup和随后的计算嵌套在循环/λ下。
我已经尝试使用np.argmin(),但是一直得到一个形状错误(一维[Df 2 ['val']列和二维[df 2 'Distance','A'
我还查看了np.select,使用“Type”中的唯一值列表作为条件,然后将参数设置为.loc,但由于.loc似乎没有正确过滤系列,因此一直出错。
我目前的想法是使用.loc来查找最近距离的索引,然后使用另一个.loc[索引号,np.select用于列)

jljoyd4f

jljoyd4f1#

您需要melt的组合来将df2重新整形为长格式,并使用merge_asof按Type合并最近的值:

out = pd.merge_asof(df1.reset_index().sort_values(by='Distance'),
                    df2.melt('Distance', var_name='Type', value_name='Df2val')
                       .sort_values(by='Distance'),
                    on='Distance', by='Type', direction='nearest'
                    ).set_index('index').reindex(df1.index)

字符串
输出量:

Client  Distance Type  Df2val
0    ABC     0.137    A     3.0
1    XYZ     0.103    B     1.0
2    KLM     0.205    C     2.6

相关问题