如何在pandas中使用groupby与filter处理DataFrame避免分组后重复输出
错误根源
你现有代码的问题出在分组过滤的逻辑判断上:用any()判断只要组内存在任意一条符合条件的条目就保留,因此同时包含正反方向的ID组,会因为存在正向/反向条目被误放进for.csv/back.csv中。
你需要调整判断逻辑为:
- 全正向组:组内所有条目方向都是FOR
- 全反向组:组内所有条目方向都是BACK
- 混合组:组内同时存在FOR和BACK两种方向
修改后完整代码
import pandas as pd import numpy as np # 读取CSV,sep='\s+'适配你示例中多空格分隔的格式,如果是标准逗号分隔删除该参数即可 df = pd.read_csv('BLAtest.csv', sep='\s+') # 计算方向逻辑保持不变 df['dire'] = np.where(df['SEQS'] < df['SEQE'], 'FOR', 'BACK') # 分组过滤:用all()判断组内所有条目都符合要求 forw = df.groupby("ID").filter(lambda x: (x['dire'] == 'FOR').all()) back = df.groupby("ID").filter(lambda x: (x['dire'] == 'BACK').all()) both = df.groupby("ID").filter(lambda x: ('FOR' in x['dire'].values) and ('BACK' in x['dire'].values)) # 输出文件,index=False去掉多余的行号列,保持和原始CSV格式一致 forw.to_csv('for.csv', index=False) back.to_csv('back.csv', index=False) both.to_csv('both.csv', index=False)
验证效果
针对你给出的示例数据,处理后输出结果如下:
for.csv仅保留ID为XM_01194.1的两条全正向记录back.csv仅保留ID为AF243527.1的两条全反向记录both.csv仅保留ID为AC037199.2的两条混合方向记录
完全符合需求,不会再出现重复输出的问题。
内容的提问来源于stack exchange,提问作者Fitzy
相关产品推荐
相关产品推荐

