如何识别两证券DataFrame非共有记录并对齐?排查isin全True异常
解决DataFrame.isin()全返回True的问题并对齐证券数据集
看起来你遇到的问题很典型——肉眼能看到两个数据集有不重合的security_ID,但isin()却全部返回True,这大概率是因为字符串里藏着你看不见的空白字符(比如空格、制表符、换行符),或者是大小写不一致导致的。我来一步步帮你解决:
第一步:排查问题根源
先验证你的security_ID字符串是否真的完全一致:
- 检查字符串长度:对比相同视觉ID的长度,比如你提到的
firefly312和google566:
# 查看df1中firefly312的字符串长度 print(df1[df1['security_ID'] == 'firefly312']['security_ID'].str.len()) # 查看df2中google566的字符串长度 print(df2[df2['security_ID'] == 'google566']['security_ID'].str.len())
如果长度不一致,说明有隐藏字符。
- 查看原始字符串细节:用
repr()函数可以显示出所有隐藏字符:
print(repr(df1.loc[3, 'security_ID'])) # 对应firefly312的行 print(repr(df2.loc[3, 'security_ID'])) # 对应google566的行
如果输出里有'firefly312 '(末尾带空格)或者'firefly312\n'(带换行符),那就是问题所在了。
第二步:清洗数据并重新检查
最直接的解决方法是先去除字符串前后的所有空白字符,再执行匹配:
import pandas as pd # 去除两个DataFrame中security_ID的前后空白 df1['security_ID'] = df1['security_ID'].str.strip() df2['security_ID'] = df2['security_ID'].str.strip() # 如果还有大小写问题,可以统一转成小写(或大写) # df1['security_ID'] = df1['security_ID'].str.lower() # df2['security_ID'] = df2['security_ID'].str.lower() # 重新执行isin检查 df1['sec_id_check'] = df1['security_ID'].isin(df2['security_ID']) df2['sec_id_check'] = df2['security_ID'].isin(df1['security_ID'])
这时候你应该能看到firefly312对应的sec_id_check是False,google566对应的也是False了。
第三步:生成对齐的DataFrame
过滤掉不匹配的记录,得到可以用于后续分析的对齐数据集:
# 过滤df1中仅保留在df2中存在的记录 df1_aligned = df1[df1['sec_id_check']].drop('sec_id_check', axis=1) # 过滤df2中仅保留在df1中存在的记录 df2_aligned = df2[df2['sec_id_check']].drop('sec_id_check', axis=1)
另外,你也可以用merge方法直接获取交集,代码更简洁:
# 获取两个数据集共有的security_ID common_ids = pd.merge(df1[['security_ID']], df2[['security_ID']], on='security_ID', how='inner') # 过滤得到对齐的DataFrame df1_aligned = df1[df1['security_ID'].isin(common_ids['security_ID'])] df2_aligned = df2[df2['security_ID'].isin(common_ids['security_ID'])]
这样处理后,两个DataFrame就只包含共同的security_ID了,后续分析就没问题啦。
内容的提问来源于stack exchange,提问作者SQLGIT_GeekInTraining
相关产品推荐
相关产品推荐

