如何判断Pandas某列值是否存在于另一列的列表中?
解决Pandas逐行检查字符串是否在对应列表列中的问题
问题分析
你之前的方法失效原因很明确:
df['amount'].isin(df['possible_amount'])是把possible_amount列的所有列表元素合并成一个全局集合做检查,不是逐行判断当前amount是否在该行的possible_amount列表里;而且如果possible_amount是列表对象,isin无法正确识别元素,直接返回全False。str.contains()只适用于字符串子串匹配,你的possible_amount是列表类型,强制转成字符串后匹配逻辑完全不符合需求。
正确解法
方法1:apply逐行处理(简单直观,适合小数据集)
直接用lambda函数逐行判断amount是否在对应行的列表中:
import pandas as pd # 构造示例数据 data = { 'id': [0, 1, 2], 'amount': ['1.00', '45.00', '37.00'], 'possible_amount': [['1.00', '2.00', '3.00'], ['100.00', '45.00'], ['29.00', '38.00']] } df = pd.DataFrame(data) # 新增match列 df['match'] = df.apply(lambda row: row['amount'] in row['possible_amount'], axis=1)
执行后得到预期结果:
id amount possible_amount match 0 0 1.00 [1.00, 2.00, 3.00] True 1 1 45.00 [100.00, 45.00] True 2 2 37.00 [29.00, 38.00] False
方法2:处理字符串格式的列表(如果你的possible_amount是字符串)
如果possible_amount列实际是类似"['1.00', '2.00', '3.00']"的字符串,需要先转成真实列表再匹配:
import ast # 先把字符串转成列表 df['possible_amount'] = df['possible_amount'].apply(ast.literal_eval) # 再执行匹配逻辑 df['match'] = df.apply(lambda row: row['amount'] in row['possible_amount'], axis=1)
方法3:矢量化方法(适合大数据集,效率更高)
如果数据量很大,apply效率偏低,可以用explode结合分组实现:
# 拆分列表并保留关联id exploded_df = df[['id', 'amount', 'possible_amount']].explode('possible_amount') # 标记每行是否匹配 exploded_df['match'] = exploded_df['amount'] == exploded_df['possible_amount'] # 按id分组,取是否存在匹配结果 df['match'] = exploded_df.groupby('id')['match'].any()
内容的提问来源于stack exchange,提问作者amnesic
相关产品推荐
相关产品推荐

