根据深度范围合并两个pandas数据帧

时间:2015-09-30 18:31:29

标签: python join pandas merge

我想在列Id和top_depth以及bottom_depth上合并两个数据帧 如果“深度”介于“top_depth”和“bottom_depth”之间,我希望从左侧df获取每条记录,如果可用,则从右侧df分配记录。

以下是数据框的例子:

df1 = pd.DataFrame(np.array([
     ['a', 27, 29, 10],
     ['a', 29, 30, 2.5],
     ['a', 30, 32.5, 56],
     ['a', 32.5, 36, 18],
     ['a', 36, 39, 5],
     ['b', 0, 3, 0.5],
     ['b', 3, 6, 1.5],
     ['b', 6, 9, 2.5]]),
     columns=['name', 'top_depth', 'bottom_depth', 'attr1'])

df2 = pd.DataFrame(np.array([
     ['a', 0, 25, 'alpha'],
     ['a', 25, 28, 'beta'],
     ['a', 28, 39, 'gamma'],
     ['b', 0, 6, 'alpha'],
     ['b', 6, 9, 'beta'],
     ['b', 9, 18, 'phi'],
     ['b', 18, 25, 'teta']]),
     columns=['name', 'top_depth', 'bottom_depth', 'attr2'])

然后合并得到这个:

>>> df3 
   name top_depth bottom_depth attr1   attr2
0     a         0           25   NaN   alpha
1     a        25           27   NaN    beta
2     a        27           28    10    beta
2     a        28           29    10   gamma
3     a        29           30   2.5   gamma
4     a        30         32.5    56   gamma
5     a      32.5           36    18   gamma
6     a        36           39     5   gamma
7     b         0            3   0.5   alpha
8     b         3            6   1.5   alpha
9     b         6            9   2.5    beta
10    b         9           18   NaN     phi
11    b        18           25   NaN    teta

在熊猫中有一种简单的方法吗?

1 个答案:

答案 0 :(得分:0)

这会让你接近:

merged = pd.merge(df1, df2, on='name', suffixes=('', '_r'))

keep = (merged.top_depth >= merged.top_depth_r) & (merged.bottom_depth <= merged.bottom_depth_r)

print merged.loc[keep, ['name', 'top_depth', 'bottom_depth', 'attr1', 'attr2']]

收率:

   name top_depth bottom_depth attr1  attr2 
2     a        27           29    10  gamma 
5     a        29           30   2.5  gamma 
8     a        30         32.5    56  gamma 
11    a      32.5           36    18  gamma 
14    a        36           39     5  gamma 
15    b         0            3   0.5  alpha 
19    b         3            6   1.5  alpha 
24    b         6            9   2.5   beta 

我不知道你想要这行:

   name top_depth bottom_depth attr1   attr2
0     a         0           25   NaN   alpha
1     a        25           27   NaN    beta

在你的问题中,你要求左连接。这些行更像是右连接。让我知道这是否接近你所追求的,我可以尝试提供更多帮助。