如何查找含整数列表列的pandas DataFrame中包含整数列的记录?isin返回空帧
解决方法:匹配包含指定整数的列表型DataFrame记录
你的问题出在isin的用法上:a['cell'].isin(b['cells'])是检查单个整数是否等于b['cells']里的整个列表(比如判断1是否等于[1,2]),显然不会匹配,所以返回空DataFrame。下面是几种可行的解决方案:
先构造示例数据(方便测试)
import pandas as pd a = pd.DataFrame({'cell': [1, 3, 5]}) b = pd.DataFrame({'cells': [[1,2], [4,5], [2,3], [6,7]]})
方法1:展开列表后匹配(直观高效)
把b的列表列拆成单个元素,找到匹配的原记录索引,再筛选:
# 展开b的cells列,保留原索引 b_exploded = b.explode('cells') # 提取匹配的唯一索引 matched_idx = b_exploded[b_exploded['cells'].isin(a['cell'])].index.unique() # 获取最终结果 df_result = b.loc[matched_idx]
执行后df_result会包含b中所有包含a里整数的记录:[[1,2], [4,5], [2,3]]。
方法2:逐行检查列表元素(灵活)
先把a的整数转成集合(加快查询速度),再对b的每行列表做存在性检查:
a_values = set(a['cell']) # 标记每行是否有匹配的整数 b['has_match'] = b['cells'].apply(lambda x: any(num in a_values for num in x)) # 筛选结果并删除辅助列 df_result = b[b['has_match']].drop('has_match', axis=1)
这个方法适合列表长度较短的场景,代码可读性强。
方法3:向量化操作(大数据量优化)
如果数据量很大,apply效率偏低,可以用numpy广播实现批量检查:
import numpy as np # 处理不等长列表:填充到最大长度 max_len = b['cells'].str.len().max() b_arr = np.array([np.pad(x, (0, max_len - len(x)), mode='constant') for x in b['cells']]) a_arr = a['cell'].to_numpy() # 批量检查每个列表是否包含a中的整数 matches = np.any(np.isin(b_arr, a_arr), axis=1) df_result = b[matches]
这种方法利用numpy的向量化运算,比循环/apply快很多,适合百万级以上的数据量。
内容的提问来源于stack exchange,提问作者user3302967
相关产品推荐
相关产品推荐

