如何合并两列并筛选观测值:额外保留非存在位置111
实现方案拆解与代码示例
首先我先明确下你的需求:最终结果需要包含两部分内容:
- 保留
list1中那些在list2里存在的位置(也就是移除list1里不在list2中的位置) - 额外添加那个不在list1里的特定位置111(我会分两种场景给出方案:不管111是否在list2里都加,或者仅当111在list2里时才加)
下面用两种最常用的数据处理工具来实现:
一、Python Pandas 实现
假设你已经把两个列表转换成了DataFrame,列名统一为location:
import pandas as pd # 模拟你的数据(实际替换成你自己的真实数据即可) df1 = pd.DataFrame({'location': [1,2,3,4,5]}) # list1:已存在的位置目录 df2 = pd.DataFrame({'location': [2,3,5,6,7]}) # list2:包含存在和非存在的位置 # 第一步:筛选出list1和list2共有的位置(即保留list1中在list2里存在的条目) common_locations = df1[df1['location'].isin(df2['location'])] # 第二步:处理特定位置111 special_loc = pd.DataFrame({'location': [111]}) # 场景1:不管111是否在list2里,只要它不在list1里就添加 if 111 not in df1['location'].values: final_result = pd.concat([common_locations, special_loc], ignore_index=True) else: final_result = common_locations # 场景2:仅当111不在list1里,且在list2里时才添加 # if 111 not in df1['location'].values and 111 in df2['location'].values: # final_result = pd.concat([common_locations, special_loc], ignore_index=True) # else: # final_result = common_locations # 查看最终结果 print(final_result)
如果你的数据只是普通Python列表,也可以用简单的列表推导实现:
list1 = [1,2,3,4,5] list2 = [2,3,5,6,7] # 先取交集 common = [x for x in list1 if x in list2] # 添加特定位置111(仅当它不在list1里) if 111 not in list1: common.append(111) # 最终结果就是common列表 print(common)
二、SQL 实现
假设你有两个数据表list1和list2,都包含location字段:
场景1:不管111是否在list2里,只要不在list1里就添加
-- 先取list1和list2的交集,再合并上特定位置111(仅当111不在list1中时) SELECT l1.location FROM list1 l1 INNER JOIN list2 l2 ON l1.location = l2.location UNION ALL SELECT 111 WHERE NOT EXISTS (SELECT 1 FROM list1 WHERE location = 111);
场景2:仅当111不在list1里且在list2里时才添加
SELECT l1.location FROM list1 l1 INNER JOIN list2 l2 ON l1.location = l2.location UNION ALL SELECT 111 WHERE NOT EXISTS (SELECT 1 FROM list1 WHERE location = 111) AND EXISTS (SELECT 1 FROM list2 WHERE location = 111);
补充说明
- 用
UNION ALL而非UNION是因为它的执行效率更高,且我们已经确保111不会和交集里的内容重复(因为判断了111不在list1中) - 如果你的需求有微调,比如要保留原列表的其他字段,只需要在代码中对应保留字段即可,核心逻辑不变
内容的提问来源于stack exchange,提问作者delete
相关产品推荐
相关产品推荐

