You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按uName与sName的关联筛选DataFrame行?

Pandas实现连续关联行筛选

核心思路

先建立uName到对应行的快速映射(O(1)查找效率),从起始行开始,循环用当前行的sName匹配下一个uName,直到找不到匹配项为止,最终收集所有关联行组成新DataFrame。这种方法适配9万行的数据集,避免逐行遍历的低效问题。

实现步骤与代码

  1. 准备示例数据
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)
  1. 构建快速映射
    将uName设为索引,直接通过uName快速定位对应行;若uName有重复,改用groupby取每个uName的首行:
# uName唯一时用这个
name_map = df.set_index('uName')

# 若uName有重复,用下面的代码去重
# name_map = df.groupby('uName').first()
  1. 编写关联链获取函数
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)
  1. 调用函数获取结果
# 从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:48:30