【问题标题】:Merge two pandas dataframes based on depth range根据深度范围合并两个熊猫数据框
【发布时间】:2015-12-28 15:54:30
【问题描述】:

我想合并列 Id 和 top_depth 和 bottom_depth 上的两个数据框。
我想从左侧 df 中获取每条记录,如果“深度”在“top_depth”和“bottom_depth”之间,则从右侧 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

在 pandas 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: python join pandas merge


    【解决方案1】:

    这会让你接近:

    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
    

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

    【讨论】:

    • 感谢它已接近。实际上,我稍微修改了我原来的问题,以更多地反映我的需要。我必须拆分“df1”的第一行(27-->28 和 28-->29),因为“df2”的深度范围不等于“df1”的深度范围。我认为这更棘手......
    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 2016-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多