我正试图将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用于列)
1条答案
按热度按时间jljoyd4f1#
您需要
melt
的组合来将df2
重新整形为长格式,并使用merge_asof
按Type合并最近的值:字符串
输出量:
型