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
相关产品推荐
相关产品推荐

