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

DataFrame行级唯一值迭代过滤方案问询

DataFrame行级唯一值迭代过滤方案问询

嘿,我完全get到你的需求了——你手里已经有个生成好的糖果数据集DataFrame,需要按行顺序迭代过滤:只要当前行里有任何一个「品类+尺寸+价格」的糖果组合是之前所有行里已经出现过的,就把整行删掉;只有当这一行里所有的糖果组合全是全新的,才保留它。而且你明确要按行出现的先后顺序来处理,第一次出现的组合留着,后续碰着带重复组合的行直接丢弃,对吧?

下面我给你对应需求的具体实现方案:


一、针对「行内任意糖果组合重复即丢弃整行」的实现(完全匹配你的需求)

这种情况我们需要跟踪所有已经出现过的糖果组合,用集合来记录效率最高,然后逐行遍历检查:

代码实现

import pandas as pd

# 先模拟你的目标DataFrame(实际使用时直接用你已有的df即可)
data = [
    ["M&M", "Mini", 2.00, "Kisses", "Reg", 3.00, "Skittles", "Mini", 3.00],
    ["Skittles", "Reg", 4.00, "Rolo", "Reg", 2.00, "Kisses", "Reg", 3.00],
    ["Peppermint", "Reg", 6.00, "Nerds", "Mini", 1.50, "KitKat", "Mini", 4.00],
    ["Skittles", "Mini", 3.00, "Skittles", "Reg", 4.0, "Rolo", "Reg", 2.00]
]
columns = ["CategoryA", "SizeA", "PriceA", "CategoryB", "SizeB", "PriceB", "CategoryC", "SizeC", "PriceC"]
df = pd.DataFrame(data, columns=columns)

# 初始化集合,用来高效记录所有已出现的糖果三元组
seen_combinations = set()
# 空列表用来存放过滤后保留的行
filtered_rows = []

# 逐行遍历原DataFrame
for idx, row in df.iterrows():
    # 提取当前行的所有糖果组合(品类+尺寸+价格)
    current_combinations = [
        (row["CategoryA"], row["SizeA"], row["PriceA"]),
        (row["CategoryB"], row["SizeB"], row["PriceB"]),
        (row["CategoryC"], row["SizeC"], row["PriceC"])
    ]
    # 检查当前行的所有组合是否都未出现过
    all_new = all(comb not in seen_combinations for comb in current_combinations)
    if all_new:
        # 所有组合都是新的,保留该行
        filtered_rows.append(row)
        # 将这些新组合加入已见集合,供后续行检查使用
        seen_combinations.update(current_combinations)
    # 否则直接跳过该行(相当于丢弃)

# 把保留的行转成新的DataFrame,重置索引
filtered_df = pd.DataFrame(filtered_rows).reset_index(drop=True)
print(filtered_df)

运行效果说明

用你的示例数据跑这段代码的话:

  • 第二行因为包含第一行已经出现过的("Kisses", "Reg", 3.00)组合,会被直接丢弃
  • 第四行里的("Skittles", "Mini", 3.00)是第一行里出现过的,所以也会被丢弃
  • 最终只会保留第一行和第三行,完全符合你的要求

灵活适配扩展

如果你的DataFrame里的糖果组合列数不固定(比如有时候一行有3个,有时候更多),可以改成动态提取组合的逻辑,不用硬编码列名:

current_combinations = []
# 每3列一组,自动提取品类、尺寸、价格
for i in range(0, len(df.columns), 3):
    cat_col = df.columns[i]
    size_col = df.columns[i+1]
    price_col = df.columns[i+2]
    current_combinations.append( (row[cat_col], row[size_col], row[price_col]) )

这样不管一行有多少个糖果组合,都能自动适配,灵活性拉满。


二、如果是整行整体去重(仅当整行完全重复时丢弃)

如果你其实是想让整行的所有列值组合唯一(只有当某一行和之前的某一行完全一模一样时才丢弃),那Pandas有内置的高效方法,比手动迭代快得多:

# keep='first'表示保留第一次出现的行,后续重复的直接丢弃
filtered_df = df.drop_duplicates(keep='first').reset_index(drop=True)

这个方法用了Pandas的向量化操作,大数据集下效率碾压手动迭代,但根据你的描述,你需要的应该是第一种方案。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:58:05