You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:25:24