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

2024-10-01 07:10:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有一些变量的数据帧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

数据帧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中的所有值?你知道吗


Tags: 数据示例dataframenprandomabs差异pd
2条回答

Op1numpy.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

Op2merge_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

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值,请使用df1执行第二个merge步骤:

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

相关问题 更多 >