我有两个dfs:
df1:
no1 no2 other1
1 10 foo
1 50 foo
1 60 cat
1 70 cat
3 12 cat
df2:
no1 start stop other2
1 2 40 dog
1 100 200 dog
3 5 15 dog
我想在以下条件下合并df1
和df2
:
1)no1列匹配,如果那是真的那么
2)df1['no2']
介于df2['start']
和df2['stop']
之间:
上述示例的所需输出将是(不需要start/stop
列,确实需要所有其他列):
df3:
no1 no2 other1 other2
1 10 foo dog
3 12 cat dog
我尝试过的解决方案(复杂,可能效率不高):我认为np.where
可能会为我做这件事,使用下面的代码,然后删除df['merge'] = no
所有的行。但它给了我一个Can only compare identically-labeled Series objects
错误,我认为这与dfs的大小不同有关。效率/速度很重要,所以即使我能解决错误,我认为这也不是可行的方法。
df2['merge'] = np.where((df1['no1'] == df2['no1'] & df2['start'] < df1['no2'] < df2['stop']), yes, no)
答案 0 :(得分:2)
外合并
merged = pd.merge(df1, df2, how='outer')
然后过滤行
>>> merged[(merged.start <= merged.no2) & (merged.no2 <= merged.stop)][['no1', 'start', 'stop', 'other2']]
no1 start stop other2
0 1 2 40 dog
8 3 5 15 dog