如何在Pandas中用另一列的URL列表对单列URL进行排名?
问题描述
现有如下结构的CSV数据(示例中用字母代替实际URL):
query,ranks a,"[k, g, y, l, a]" h,"[f, g, l, h, p]" x,"[b, x, y, a, g]" w,"[w, I, b, d, g]" r,"[I, r, n, f, g]"
需要新增一列rank,记录query中的值在对应ranks列表中的1-based排名,期望输出如下:
query,ranks,rank a,"[k, g, y, l, a]",5 h,"[f, g, l, h, p]",4 x,"[b, x, y, a, g]",2 w,"[w, I, b, d, g]",1 r,"[I, r, n, f, g]",2
补充说明:ranks列的值是字符串格式的列表,部分行的ranks列表可能不包含对应query的值。
解决方案
使用Python的pandas库可实现需求,步骤如下:
- 读取CSV并将
ranks列的字符串解析为实际列表 - 逐行计算
query值在列表中的位置,转换为1-based排名 - 处理
query不在列表中的异常情况
完整代码示例
import pandas as pd import ast # 读取目标CSV文件 df = pd.read_csv("input.csv") # 解析字符串格式的列表为Python列表 df["ranks_parsed"] = df["ranks"].apply(ast.literal_eval) # 定义计算排名的函数 def calculate_rank(row): target = row["query"] lst = row["ranks_parsed"] try: # 索引从0开始,+1转为1-based排名 return lst.index(target) + 1 except ValueError: # 若目标不在列表中,返回缺失值pd.NA,也可替换为0/None等自定义值 return pd.NA # 生成rank列 df["rank"] = df.apply(calculate_rank, axis=1) # 删除中间辅助列,保留原列和新生成的rank列 df = df.drop("ranks_parsed", axis=1) # 将结果保存为新的CSV df.to_csv("output.csv", index=False)
关键说明
ast.literal_eval():安全解析字符串格式的列表,避免eval()带来的安全风险list.index():获取元素在列表中的索引,元素不存在时抛出ValueError,通过try-except捕获并返回缺失值- 若需要对
query不在列表中的情况做特殊处理,可修改except块的返回值(比如返回0或"未找到")
内容的提问来源于stack exchange,提问作者Mystic
相关产品推荐
相关产品推荐

