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”,但我无法得到我想要的结果。它应该是这样的:
使用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)
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |