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

Python:满足条件时对比Dataframe列内各行的列表并生成布尔值

Pandas 实现方案

完整实现代码

首先导入依赖包,构造示例数据,再执行逻辑计算:

import pandas as pd
from collections import Counter

# 构造示例输入DataFrame
data = {
    "Name": ["A", "A", "A", "A", "A", "B", "B"],
    "Number": [905, 905, 905, 805, 805, 905, 905],
    "List": [[100,200,300,400], [200,500], [100,900], [100], [200], [600,700], [800,900]]
}
df = pd.DataFrame(data)

# 核心处理逻辑
def calc_output(group):
    # 统计分组内所有元素的总出现次数
    total_cnt = Counter()
    for lst in group["List"]:
        total_cnt.update(lst)
    
    res = []
    for current_lst in group["List"]:
        # 扣除当前行的元素计数,剩余就是其他行的出现次数
        temp_cnt = total_cnt.copy()
        temp_cnt.subtract(current_lst)
        # 只要有一个元素在其他行出现过,就返回False
        has_overlap = any(temp_cnt[num] > 0 for num in current_lst)
        res.append(not has_overlap)
    group["Output"] = res
    return group

# 按Name+Number分组执行逻辑
df = df.groupby(["Name", "Number"], group_keys=False).apply(calc_output)
print(df)

输出验证

运行后得到的结果和期望输出完全一致:

Name  Number               List  Output
0    A     905  [100, 200, 300, 400]   False
1    A     905           [200, 500]   False
2    A     905           [100, 900]   False
3    A     805                [100]    True
4    A     805                [200]    True
5    B     905           [600, 700]    True
6    B     905           [800, 900]    True

逻辑说明

  1. 首先按照Name和Number两个字段对DataFrame做分组,保证同组内的两行这两个字段完全相等
  2. 对每个分组先统计所有List列元素的总出现次数
  3. 逐行计算:把当前行的元素计数从总计数里扣除,检查当前行的元素是否还有剩余计数(也就是在其他行出现过)
  4. 存在重叠元素则Output为False,否则为True

该方案时间复杂度较低,适合处理数据量较大的场景。如果是小数据量需要更直观的逻辑,可以改用逐行对比同组其他行元素的写法,核心判断逻辑和上述方案一致。

内容的提问来源于stack exchange,提问作者Gabriel Choo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 06:39:03