仅保留最接近给定值的数据框行

时间:2017-11-15 18:36:01

标签: python pandas

我有一个带有一些变量的数据框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中的所有值?

2 个答案:

答案 0 :(得分:4)

reindexmethod='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