如何通过列的近似值组合/合并数据框?

use*_*026 3 python merge dataframe pandas

这是一个更大数据的例子。想象一下我有两个像这样的数据框:

import pandas as pd
import numpy as np

np.random.seed(42)
df1 = pd.DataFrame({'Depth':np.arange(0.5, 4.5, 0.5),
                    'Feat1':np.random.randint(20, 70, 8)})

df2 = pd.DataFrame({'Depth':[0.4, 1.1, 1.5, 2.2, 2.8],
                    'Rock':['Sand','Sand','Clay','Clay','Marl']})
Run Code Online (Sandbox Code Playgroud)

它们的大小不同,我想将 df2 中的“Rock”列信息作为新列放在 df1 上。这种组合应该基于这两个数据帧的“深度”列来完成,但它们具有不同的采样率。df1 遵循 0.5 的恒定步长,但 df2 的厚度不同。

所以我想根据“深度”的近似值合并这些信息。例如:如果 df2 样本的“深度”为 2.2,则查看 df1 最接近的“深度”值(应为 2.0),并在该样本上添加“岩石”信息(“粘土”)。重要的是,可以在新列上重复“Rock”值,以避免在此分段内丢失数据。有人可以帮助我吗?

我已经尝试过一些 pandas 方法,如“merge”和“combine_first”,但我无法得到我想要的结果。它应该是这样的:

在此输入图像描述

Hen*_*ker 7

使用merge_asof

df3 = pd.merge_asof(df1, df2, on='Depth', tolerance=0.5, direction='nearest')
Run Code Online (Sandbox Code Playgroud)

df3

   Depth  Feat1  Rock
0    0.5     58  Sand
1    1.0     48  Sand
2    1.5     34  Clay
3    2.0     62  Clay
4    2.5     27  Clay
5    3.0     40  Marl
6    3.5     58   NaN
7    4.0     38   NaN
Run Code Online (Sandbox Code Playgroud)

完整的工作示例:

import numpy as np
import pandas as pd

np.random.seed(42)
df1 = pd.DataFrame({
    'Depth': np.arange(0.5, 4.5, 0.5),
    'Feat1': np.random.randint(20, 70, 8)
})

df2 = pd.DataFrame({
    'Depth': [0.4, 1.1, 1.5, 2.2, 2.8],
    'Rock': ['Sand', 'Sand', 'Clay', 'Clay', 'Marl']
})

df3 = pd.merge_asof(df1, df2, on='Depth', tolerance=0.5, direction='nearest')

print(df3)
Run Code Online (Sandbox Code Playgroud)