列表中DataFrame去重:忽略第一行差异其余行相同即判定重复
问题原因
你原来的drop_duplicates不生效是因为pandas对Series里的DataFrame元素做重复判定时,要求整个DataFrame的结构、列名、所有行内容完全一致,你给出的两个测试DataFrame列名不同,自然会被判定为非重复项。
解决方案
我们可以自定义比较规则,仅提取每个DataFrame第二行到最后一行的内容生成唯一标识,用字典做去重即可:
完整可运行代码
import pandas as pd import numpy as np # 测试数据 df = [] df1 = pd.DataFrame(np.array([[1, 0.5], [2, 0.5]]), columns=['id', 'df_1']) df2 = pd.DataFrame(np.array([[1, 0.5], [2, 0.5]]), columns=['id', 'df_2']) df.append(df1) df.append(df2) # 自定义去重逻辑 seen = {} for curr_df in df: # 提取第二行及之后的所有内容,转成可哈希的元组作为去重判定键 compare_key = tuple(curr_df.iloc[1:].itertuples(index=False, name=None)) # 相同键仅保留第一个出现的DataFrame,要保留最后一个可以删掉if判断直接赋值 if compare_key not in seen: seen[compare_key] = curr_df # 得到去重后的结果 unique = list(seen.values()) print(unique)
逻辑说明
curr_df.iloc[1:]精准匹配需求,仅取第二行到最后一行的内容作为判定依据,忽略第一行差异itertuples将每行数据转成元组,外层再套tuple()后变为可哈希对象,可以作为字典的键实现去重- 去重保留哪条可自行调整:保留第一条就加
if compare_key not in seen的判断,保留最后一条直接seen[compare_key] = curr_df即可
内容的提问来源于stack exchange,提问作者Kit Wai
相关产品推荐
相关产品推荐

