Pandas数据处理问询:保留最大列值行与聚合计算
解决序列比对数据的分组去重与聚合需求
看起来你在处理序列比对结果时遇到了分组保留最大值和聚合计算的问题,我来帮你用Pandas一步步实现你的两个需求,先从构造测试数据开始(和你给出的完全一致):
构造测试数据
import pandas as pd data = [ ["EV239", "B/Fw6/623", 99.23, 0.966, 832, 356], ["EV239", "B/Fw6/623", 97.34, 0.982, 1022, 739], ["EV239", "MMS-alpha", 92.23, 0.997, 838, 384], ["EV239", "MMS-alpha", 93.49, 0.993, 1402, 829], ["EV380", "B/Fw6/623", 94.32, 0.951, 324, 423], ["EV380", "B/Fw6/623", 95.27, 0.932, 1245, 938], ["EV380", "MMS-alpha", 99.23, 0.927, 723, 522], ["EV380", "MMS-alpha", 99.15, 0.903, 948, 1092] ] df = pd.DataFrame(data, columns=["query", "target", "pct-similarity", "p-val", "aln_length", "bit-score"])
需求1:按query+target去重,保留aln_length最大的行
这里有两种高效的实现方式:
方法一:先排序再去重
先按query、target分组,再对aln_length降序排序,最后保留每组的第一行(即长度最大的行):
# 按分组键排序,再对aln_length降序排列 sorted_df = df.sort_values(by=['query', 'target', 'aln_length'], ascending=[True, True, False]) # 去重,保留每组的第一个(最大aln_length)行 max_aln_rows = sorted_df.drop_duplicates(subset=['query', 'target'], keep='first').reset_index(drop=True) print("需求1结果:") print(max_aln_rows)
方法二:用idxmax直接定位最大行
这种方法更适合大数据量,直接找到每组中aln_length最大的行的索引,再提取对应行:
# 获取每组中aln_length最大的行的索引 max_indices = df.groupby(['query', 'target'])['aln_length'].idxmax() # 根据索引提取行 max_aln_rows = df.loc[max_indices].reset_index(drop=True) print("需求1结果:") print(max_aln_rows)
两种方法的输出结果一致,都会保留每组aln_length最大的完整行。
需求2:按query+target聚合,保留aln_length最大的行,同时计算该组pct-similarity平均值
我们可以先给原数据添加一个组内平均值列,再筛选出最大长度的行,这样就能同时保留目标行信息和组平均值:
# 计算每组的pct-similarity平均值,用transform广播到每一行 df['avg_pct_similarity'] = df.groupby(['query', 'target'])['pct-similarity'].transform('mean') # 筛选每组中aln_length最大的行 result = df.loc[df.groupby(['query', 'target'])['aln_length'].idxmax()].reset_index(drop=True) # 可选:只保留需要的列(去掉不需要的p-val、bit-score等) result = result[['query', 'target', 'aln_length', 'pct-similarity', 'avg_pct_similarity']] print("需求2结果:") print(result)
运行后你会得到:每组aln_length最大的行的详细信息,加上该组所有pct-similarity的平均值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者AndreyIto
相关产品推荐
相关产品推荐

