我想在列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
在熊猫中有一种简单的方法吗?
答案 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
在你的问题中,你要求左连接。这些行更像是右连接。让我知道这是否接近你所追求的,我可以尝试提供更多帮助。