如何高效删除Pandas DataFrame中匹配另一DataFrame链接的单元格
高效处理Pandas DataFrame中已完成调研链接的置空操作
核心思路
不用遍历单元格,通过宽表转长表的方式批量处理匹配,再转回宽表,利用Pandas的矢量化操作提升效率。
具体实现步骤
假设信息表名为info_df,结果表名为done_df:
提取并转换web相关列到长格式
先筛选出所有webName和webURL列,将多组列转成成对的行,保留Person和ID作为标识列:import pandas as pd # 提取所有webName和webURL列 web_name_cols = [col for col in info_df.columns if col.startswith('webName')] web_url_cols = [col for col in info_df.columns if col.startswith('webURL')] # 把每组webName和webURL转成长表 long_df = pd.DataFrame() for name_col, url_col in zip(web_name_cols, web_url_cols): temp = info_df[['Person', 'ID', name_col, url_col]].rename( columns={name_col: 'webName', url_col: 'webURL'} ) long_df = pd.concat([long_df, temp], ignore_index=True)批量标记并置空已完成的链接
把结果表的链接转成集合(查找效率更高),用矢量化操作匹配并置空对应字段:# 生成已完成链接的集合 done_links = set(done_df['link']) # 匹配并置空对应名称和链接 mask = long_df['webURL'].isin(done_links) long_df.loc[mask, ['webName', 'webURL']] = None转回宽表并整理列顺序
给长表的每组web字段添加序号,再转回宽表,最后恢复原表的列顺序:# 给每个Person-ID组合的web条目添加序号 long_df['web_num'] = long_df.groupby(['Person', 'ID']).cumcount() + 1 # 转回宽表 wide_name_df = long_df.pivot(index=['Person', 'ID'], columns='web_num', values='webName').add_prefix('webName') wide_url_df = long_df.pivot(index=['Person', 'ID'], columns='web_num', values='webURL').add_prefix('webURL') # 合并并重置索引 result_df = pd.concat([wide_name_df, wide_url_df], axis=1).reset_index() # 整理列顺序,保持Person、ID在前,按webName1/webURL1、webName2/webURL2的顺序排列 sorted_cols = ['Person', 'ID'] for num in range(1, len(web_name_cols)+1): sorted_cols.extend([f'webName{num}', f'webURL{num}']) result_df = result_df[sorted_cols]
关键优势
- 全程用Pandas矢量化操作和集合查找,比遍历单元格效率高几个数量级,适配大数据量场景
- 自动处理不同人员链接数量差异的情况,转长表统一处理后转回宽表,自动补全空值
内容的提问来源于stack exchange,提问作者Awwwwwan
相关产品推荐
相关产品推荐

