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
逻辑说明
- 首先按照
Name和Number两个字段对DataFrame做分组,保证同组内的两行这两个字段完全相等 - 对每个分组先统计所有List列元素的总出现次数
- 逐行计算:把当前行的元素计数从总计数里扣除,检查当前行的元素是否还有剩余计数(也就是在其他行出现过)
- 存在重叠元素则Output为False,否则为True
该方案时间复杂度较低,适合处理数据量较大的场景。如果是小数据量需要更直观的逻辑,可以改用逐行对比同组其他行元素的写法,核心判断逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Gabriel Choo
相关产品推荐
相关产品推荐

