如何用Pandas按uName与sName的关联筛选DataFrame行?
Pandas实现连续关联行筛选
核心思路
先建立uName到对应行的快速映射(O(1)查找效率),从起始行开始,循环用当前行的sName匹配下一个uName,直到找不到匹配项为止,最终收集所有关联行组成新DataFrame。这种方法适配9万行的数据集,避免逐行遍历的低效问题。
实现步骤与代码
- 准备示例数据
import pandas as pd d = {'ID': [1, 2,3,4,5,6], 'uName': ['Mark', 'Joe', 'Patty', 'Mary', 'Ted', 'Sam'], 'sName': ['Patty','Mary', 'Sam','Sally','Tony','Bob'], 'hrs': [20, 16,35,18,15,21], 'dep': ['A', 'J', 'K','I','P','U']} df = pd.DataFrame(data=d)
- 构建快速映射
将uName设为索引,直接通过uName快速定位对应行;若uName有重复,改用groupby取每个uName的首行:
# uName唯一时用这个 name_map = df.set_index('uName') # 若uName有重复,用下面的代码去重 # name_map = df.groupby('uName').first()
- 编写关联链获取函数
def get_associated_chain(start_name, name_map): chain = [] current_name = start_name # 循环查找直到无匹配项 while current_name in name_map.index: current_row = name_map.loc[current_name] chain.append(current_row) # 更新下一个要匹配的uName current_name = current_row['sName'] # 转换为DataFrame并重置索引 return pd.DataFrame(chain).reset_index(drop=True)
- 调用函数获取结果
# 从Mark开始获取关联链 result_df = get_associated_chain('Mark', name_map) print(result_df)
输出结果:
ID uName sName hrs dep 0 1 Mark Patty 20 A 1 3 Patty Sam 35 K 2 6 Sam Bob 21 U
性能说明
对于9万行数据集,set_index是O(n)的一次性操作,后续每次查找都是O(1),整体效率仅取决于关联链的长度,远快于逐行遍历匹配的方式。
关于NetworkX的补充
用NetworkX确实可行:将uName和sName作为节点,每行数据作为边的属性,从起始节点出发寻找路径。但对于这种线性单链匹配,Pandas的方法更直接轻量化,无需构建整个图结构,效率更高。
内容的提问来源于stack exchange,提问作者Messak
相关产品推荐
相关产品推荐

