我有一个带有一些变量的数据框df1
,给定了某些值A:
df1 = pd.DataFrame({"A": [110.035,110.078,110.732,112.828,112.930],
"var1": np.random.random(5),
"var2":np.random.random(5)})
A var1 var2
0 110.035 0.500537 0.571497
1 110.078 0.234550 0.732815
2 110.732 0.337149 0.098250
3 112.828 0.190261 0.366118
4 112.930 0.990539 0.892640
和值为A的数据框df2
df2 = pd.DataFrame({"A": [110.04, 112.83]})
A
0 110.04
1 112.83
现在我想保留df1中的所有值,这些值最接近df2中的一个值,然后删除所有其他值。在我的例子中,我想仅保留第0行和第3行。
我的想法是建立绝对差异并使用argsort():
(df1.A-x).abs().argsort()[:1]
但这仅适用于一个值x
,如何将其扩展到df2中的所有值?
答案 0 :(得分:4)
将reindex
与method='nearest'
:
df = df1.set_index('A').reindex(df2.A, method='nearest').reset_index()
df
A var1 var2
0 110.04 0.262062 0.624065
1 112.83 0.107757 0.167591
如果您想要恢复原始的A
值,请使用merge
执行第二个df1
步骤:
df.merge(df1, on=['var1', 'var2']).reindex(columns=df1.columns)
A var1 var2
0 110.035 0.262062 0.624065
1 112.828 0.107757 0.167591
答案 1 :(得分:3)
Op1 numpy.searchsorted
使用numpy.searchsorted
然后使用索引切片df1
df1.loc[np.searchsorted(df1.A, df2.A)-1]
Out[826]:
A var1 var2
0 110.035 0.007591 0.768843
3 112.828 0.426480 0.902606
Op2 merge_asof
pd.merge_asof(df2,df1,on='A',direction='nearest')
Out[819]:
A var1 var2
0 110.04 0.007591 0.768843
1 112.83 0.426480 0.902606