如何使用Pandas筛选DataFrame的R_ID列仅保留与A_ID列共有值
正确实现代码
你要的效果不需要用关联操作,直接对R_ID列做条件匹配即可:
import pandas as pd import numpy as np # 构造原始DataFrame data = {'A_ID': ['1E2', '1E3', '1E4', '1E5'], 'R_ID': ['1E7',[np.nan],[np.nan],"1E4",]} df = pd.DataFrame(data) # 处理R_ID中部分值为列表包裹的问题(若实际数据无此特殊格式可跳过这一步) df['R_ID'] = df['R_ID'].apply(lambda x: x[0] if isinstance(x, list) and len(x) == 1 else x) # 仅保留R_ID中存在于A_ID列的值,其余替换为NaN df['R_ID'] = df['R_ID'].where(df['R_ID'].isin(df['A_ID']), np.nan) print(df)
运行后输出和你期望的结果完全一致,原有行索引、A_ID列完全不变。
原方案错误原因
- 第一种merge方案:内连接的逻辑是保留两个表中满足匹配条件的行,会直接过滤掉不匹配的行,完全不符合你「保留所有原有行、仅改列值」的需求;同时你同时指定了
right_on和right_index参数,逻辑冲突才触发类型报错。 - 第二种concat方案:
concat的innerjoin是按行索引取交集,你代码中用了未定义的dataset_A_ID、dataset_R_ID变量,就算变量名修正,也没有做值匹配的逻辑,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者DanielSchloß
相关产品推荐
相关产品推荐

