Python 如何按列的近似值组合/合并数据帧?

Python 如何按列的近似值组合/合并数据帧?,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,这是一个更大数据的例子。假设我有两个数据帧,如下所示: 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,

这是一个更大数据的例子。假设我有两个数据帧,如下所示:

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']})
它们有不同的大小,我想把来自df2的“Rock”列的信息作为一个新列放在df1上。这种组合应该基于这两个数据帧中的“深度”列进行,但它们具有不同的采样率。Df1遵循0.5的恒定步长,但df2的厚度不同

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

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

使用:

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

完整的工作示例:

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)

谢谢你的快速回答,亨利。虽然,我试图复制您的代码,但在索引1的“Rock”列中得到了一个NaN值。。。[1.0-48-NaN]。这可能是因为熊猫的不同版本吗?不,这是我在一次编辑中的错误,我不小心删除了方向参数@user026。现在试试,太好了!非常感谢你。
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)