基于动态列表条件在Pandas中创建新列的实现方案
Pandas DataFrame Delta与Taxa差异检查赋值方案
给定数据
分组列表
delta = ['1','5'] taxa = ['2','3','4']
目标DataFrame
import pandas as pd data = { 'id': [101,102,103,104,105], '1_srcA': ['a', 'b','c', 'd', 'g'] , '1_srcB': ['a', 'b','c', 'd', 'e'] , '2_srcA': ['g', 'b','f', 'd', 'e'] , '2_srcB': ['a', 'b','c', 'd', 'e'] , '3_srcA': ['a', 'b','c', 'd', 'e'] , '3_srcB': ['a', 'b','1', 'd', 'm'] , '4_srcA': ['a', 'b','c', 'd', 'e'] , '4_srcB': ['a', 'b','c', 'd', 'e'] , '5_srcA': ['a', 'b','c', 'd', 'e'] , '5_srcB': ['m', 'b','c', 'd', 'e'] } df = pd.DataFrame(data)
检查规则
- 若delta列表中任意一组列对(如
1_srcA与1_srcB)存在差异,新列赋值2; - 若仅taxa列表中任意一组列对存在差异,新列赋值1;
- 若delta和taxa列对同时存在差异,仍赋值2;
- 所有列对均无差异时,赋值0。
最优实现代码
# 生成delta组的差异掩码:只要有一组delta列对不同,标记为True delta_diff = pd.Series(False, index=df.index) for num in delta: delta_diff |= df[f"{num}_srcA"] != df[f"{num}_srcB"] # 生成taxa组的差异掩码:只要有一组taxa列对不同,标记为True taxa_diff = pd.Series(False, index=df.index) for num in taxa: taxa_diff |= df[f"{num}_srcA"] != df[f"{num}_srcB"] # 按规则赋值新列 df['check_result'] = 0 # 仅taxa有差异的行赋值1 df.loc[taxa_diff & ~delta_diff, 'check_result'] = 1 # delta有差异的行(含同时满足taxa差异的情况)赋值2 df.loc[delta_diff, 'check_result'] = 2
代码说明
- 差异掩码生成:通过遍历分组列表,用逻辑或(
|=)累积每行的差异状态,只要该组内有任意一对列不同,该行就标记为差异行; - 优先级赋值:先初始化新列为0,再处理低优先级的“仅taxa差异”情况,最后处理高优先级的“delta差异”情况,确保规则3的优先级生效。
内容的提问来源于stack exchange,提问作者usr_lal123
相关产品推荐
相关产品推荐

