Pandas合并后批量处理成对列:判断相等性并执行重命名/删除操作
Pandas合并后批量处理成对列:判断相等性并执行重命名/删除操作
嘿,这个需求我之前处理过类似的,针对你这种6M行、200列的中等偏大数据集,得兼顾效率和简洁性,我给你梳理个靠谱的方案:
核心思路
先识别出所有带_first和_second后缀的成对列,然后逐对检查是否完全相等,再根据结果执行重命名/删除或者保留操作。关键是要用Pandas底层优化的方法,避免低效的逐行循环。
具体实现步骤
提取成对列的前缀
先把所有带_first后缀的列名提取出来,去掉后缀得到原始前缀,再对应到每一对列:# 获取所有带_first后缀的列的前缀 prefixes = [col[:-6] for col in df3.columns if col.endswith('_first')] # 构建前缀与对应成对列的映射 column_pairs = {prefix: (f"{prefix}_first", f"{prefix}_second") for prefix in prefixes}逐对检查并处理列
用Pandas的equals()方法来判断两列是否完全相等(这个方法是底层优化过的,比手动用==再all()高效得多,还能处理数据类型不一致但值相同的情况):for prefix, (col_first, col_second) in column_pairs.items(): # 检查两列是否完全相等(包括NaN的位置,若要把NaN视为相等可看下面的优化) if df3[col_first].equals(df3[col_second]): # 重命名_first列为原始前缀 df3.rename(columns={col_first: prefix}, inplace=True) # 删除对应的_second列 df3.drop(columns=col_second, inplace=True) else: # 不相等则保留两列,也可以在这里加个打印提示 print(f"列 {col_first} 和 {col_second} 内容不一致,已保留两列")
针对NaN的特殊处理
如果你的数据里有NaN,且希望把相同位置的NaN视为相等,可以修改判断逻辑,用一个不会出现在数据里的特殊值填充NaN后再比较:
# 用一个不会出现在数据中的值填充NaN,再判断相等性 fill_value = -999999 # 替换成你数据中不可能出现的值 if df3[col_first].fillna(fill_value).equals(df3[col_second].fillna(fill_value)): # 后续重命名/删除操作同上
效率小贴士
- 对于6M行的数据集,这个方法的效率是可接受的:因为逐列比较是Pandas底层C实现的循环,比Python层面的逐行循环快很多。
- 尽量避免多次复制整个DataFrame,用
inplace=True可以减少内存开销;如果担心修改原数据,可以先复制一份df3_copy = df3.copy()再处理。
备注:内容来源于stack exchange,提问作者te time
相关产品推荐
相关产品推荐

